Sh শেল ব্যবহার করে একটি স্ট্রিংয়ের তুলনা করুন


193

আমি এসএইচ শেল ব্যবহার করছি এবং আমি একটি স্ট্রিংকে একটি ভেরিয়েবলের মানের সাথে তুলনা করার চেষ্টা করছি তবে ifশর্তটি সর্বদা সত্য থেকে কার্যকর হয়। কেন?

এখানে কিছু কোড রয়েছে:

Sourcesystem="ABC"

if [ "$Sourcesystem" -eq 'XYZ' ]; then 
    echo "Sourcesystem Matched" 
else
    echo "Sourcesystem is NOT Matched $Sourcesystem"  
fi;

echo Sourcesystem Value is  $Sourcesystem ;

এমনকি এটি কাজ করছে না:

Sourcesystem="ABC"

if [ 'XYZ' -eq "$Sourcesystem" ]; then 
    echo "Sourcesystem Matched" 
else
    echo "Sourcesystem is NOT Matched $Sourcesystem"  
fi;

echo Sourcesystem Value is  $Sourcesystem ;

দ্বিতীয়ত, আমরা কি এটি কোনও নূলে বা খালি স্ট্রিংয়ের সাথে মিলাতে পারি?


বোর্ন শেলতে প্রথমে আপনার অতিরিক্ত ';' লাগবে না; আমি যখন বোর্ন শেলটিতে স্ক্রিপ্টটি চালানোর পরীক্ষা করি, তবে যদি শর্তটি মিথ্যা হয়। এটি প্রথমে একটি সতর্কতা দেবে: [: এবিসি: পূর্ণসংখ্যার অভিব্যক্তি প্রত্যাশিত। আউটপুটটি হ'ল: "সোর্স সিস্টেমটি মেলে না এটিবিসি"। অন্যদের মতামত হিসাবে, -eq পূর্ণসংখ্যার তুলনার জন্য ব্যবহৃত হয়। বোর্ন শেলটিতে স্ট্রিং তুলনার জন্য একটি একক সমান চিহ্ন ব্যবহার করুন (#! / বিন / শ) আপনার শেলটি প্রথমে আপনাকে সংশোধন করা উচিত ছিল।
কেমিন ঝো

6
পুনরায় খুলতে ভোট। উদ্ধৃত ডুপগুলি ব্যাশ শেলের জন্য, অ্যানিমিক শ শেল নয় যা কখনও কখনও পসিক্স শেল বা ড্যাশ হয়।
jwww

4
সম্মত এবং তাই ভোট দিয়েছেন। shএবং bashহিসাবে একই সম্পর্ক বহন Cএবং C++। যদিও প্রথমটির জন্য লিখিত কোডটি দ্বিতীয়টিতে বৈধ, দ্বিতীয়টির উত্তরগুলিতে প্রথমটিতে কাজ করার জন্য বিশ্বাস করা যায় না।
btilly

উত্তর:


281

=স্ট্রিং তুলনার জন্য আপনার অপারেটরটি ব্যবহার করা উচিত :

Sourcesystem="ABC"

if [ "$Sourcesystem" = "XYZ" ]; then 
    echo "Sourcesystem Matched" 
else
    echo "Sourcesystem is NOT Matched $Sourcesystem"  
fi;

man testবলে যে আপনি -zখালি স্ট্রিংয়ের জন্য ম্যাচ করতে ব্যবহার করেন।


4
এটি উদ্ধৃতি ABCবা প্রয়োজন হয় না XYZ
সিলিং

28
আপনার ভেরিয়েবলের যদি এতে ফাঁকা স্থান থাকতে পারে তবে উদ্ধৃতি দেওয়া দরকার।
উইলিয়াম এভারেট

4
অংশটি পরিষ্কার করার জন্য উদাহরণটি সামঞ্জস্য করুন @ উইলিয়ামএভেরেট।
প্রতি লন্ডবার্গ


35

eq এর পরিবর্তে সমান '=' ব্যবহারের তুলনা করতে ব্যবহৃত হয়, উদাহরণস্বরূপ:

if [ 'AAA' = 'ABC' ];
then 
    echo "the same" 
else 
    echo "not the same"
fi

শুভকামনা


দ্রষ্টব্য: আপনি যদি ভেরিয়েবলের সাথে তুলনা করে থাকেন তবে নিশ্চিত হয়ে নিন যে আপনি ব্যবহার করছেন "$VAR"এবং সহজভাবে নয়$VAR
শ্রীধর সারনোবাত

21

আমারও একই সমস্যা ছিল, এই কর

if [ 'xyz' = 'abc' ];
then
echo "match"
fi

সাদা স্থান লক্ষ্য করুন। =সাইন এর পরে এবং তার আগে আপনি এই ক্ষেত্রে একটি সাদা স্থান ব্যবহার করা জরুরী ।

" অন্যান্য তুলনা অপারেটর " দেখুন।


4
Dockerfile মধ্যে দিনঃ / bin / SH: 1: [: =: অপ্রত্যাশিত অপারেটর
holms

10

-eqপূর্ণসংখ্যা তুলনা করার জন্য শেল তুলনা অপারেটর। স্ট্রিংগুলির তুলনা করার জন্য আপনাকে ব্যবহার করতে হবে =


5

-eqএকটি গাণিতিক তুলনা অপারেটর। আমি কখনও স্ট্রিং তুলনা, নির্ভর ==এবং তুলনা জন্য ব্যবহার করি নি !=

if [ 'XYZ' == 'ABC' ]; then   # Double equal to will work in Linux but not on HPUX boxes it should be if [ 'XYZ' = 'ABC' ] which will work on both
  echo "Match"
else
  echo "No Match"
fi

18
নোট করুন অপারেটর ==প্রতিটি শেলের উপর কাজ করে না। =স্ট্রিংগুলির তুলনা করার জন্য সঠিক অপারেটরটি ব্যবহার করা হয় এবং ==এটি কখনও কখনও প্রতিশব্দ হয়।
ওমর দাগান

3

আমি যে 4 টি শেল পরীক্ষা করে দেখেছি ABC -eq XYZতার মধ্যে testবিল্ট ইন zshও এর জন্য সত্য মূল্যায়ন করে ksh। অভিব্যক্তি মিথ্যা অধীনে মূল্যায়ণ /usr/bin/testএবং জন্য builtins dashএবং bash। ইন kshএবং zsh, স্ট্রিংগুলি সংখ্যাসূচক মানগুলিতে রূপান্তরিত হয় এবং এটি সমান হয় যেহেতু তারা উভয়ই 0 আইএমও হয়, বিল্টইনগুলির জন্য আচরণ kshএবং zshভুল হয়, তবে এর জন্য অনুমানটি স্পষ্ট নয় test


4
পরীক্ষার জন্য ধন্যবাদ। সেই কারণেই বোর্ন শেল জনপ্রিয়।
কেমিন ঝো

zsh স্পষ্টভাবে আউটপুটস : [ বা বিল্টিন টেস্ট ব্যবহারের পরে পূর্ণসংখ্যার অভিব্যক্তি প্রত্যাশিত । হতে পারে আপনি অত্যাচার করা হয় [[ যা মূল্যায়ণ উভয় স্ট্রিং হিসাবে 0 হিসাবে হয় না উল্লেখযোগ্য পূর্ণসংখ্যার।
933k

@ কোড933k কোন সংস্করণ? আচরণ বদলে গেলে আমি অবাক হব না।
উইলিয়াম পার্সেল 21

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.