বাশ সমতা অপারেটরগুলি (==, -eq)


136

কেউ দয়া করে বাশ স্ক্রিপ্টিংয়ের মধ্যে -eqএবং পার্থক্যটি ব্যাখ্যা করতে পারেন ==?

নিম্নলিখিতগুলির মধ্যে কোনও পার্থক্য আছে কি?

[ $a -eq $b ] এবং [ $a == $b ]

==ভেরিয়েবলের সংখ্যা থাকাতে এটি কী কেবল ব্যবহার করা হয়?

উত্তর:


187

এটি অন্য উপায়ে: =এবং ==স্ট্রিং তুলনার -eqজন্য, সংখ্যার জন্য হয়। -eqযেমন একই পরিবারের রয়েছে -lt, -le, -gt, -ge, এবং -ne, যদি আপনি মনে রাখবেন যাহা তাহাই সাহায্য করে।

==উপায় দ্বারা, একটি বাশ-ইসম হয়। পসিক্স ব্যবহার করা আরও ভাল =। ব্যাশে দুটি সমান এবং সরল sh =এ কেবলমাত্র কাজের গ্যারান্টিযুক্ত।

$ a=foo
$ [ "$a" = foo ]; echo "$?"       # POSIX sh
0
$ [ "$a" == foo ]; echo "$?"      # bash specific
0
$ [ "$a" -eq foo ]; echo "$?"     # wrong
-bash: [: foo: integer expression expected
2

(পার্শ্ব দ্রষ্টব্য: এই পরিবর্তনশীল বিস্তৃতি উদ্ধৃত করুন! উপরের ডাবল উদ্ধৃতিগুলি ছেড়ে যাবেন না।)

আপনি যদি #!/bin/bashস্ক্রিপ্ট লিখছেন তবে আমি পরিবর্তে এটি ব্যবহারের[[ পরামর্শ দিচ্ছি । দ্বিগুণ ফর্মটিতে আরও বৈশিষ্ট্য রয়েছে, আরও প্রাকৃতিক বাক্য গঠন এবং আরও কম গ্যাচাস রয়েছে যা আপনাকে ট্রিপ করবে। এর জন্য ডাবল উদ্ধৃতি আর প্রয়োজন হয় না $a:

$ [[ $a == foo ]]; echo "$?"      # bash specific
0

আরো দেখুন:


1
@ ডিজে ক্র্যাশডমি, [[সামগ্রিকভাবে বাশ (এবং আরও অনেকগুলি শাঁস) গৃহীত একটি 1980-এর যুগের খস-ইসম। যে পুরো পয়েন্ট - আপনি আছে যদি [[ এ সব , তাহলে আপনি নিরাপদে অনুমান করতে পারেন ksh যে সকল এক্সটেনশান এটি প্রায় (বাস্তবায়িত fnmatch()-style প্যাটার্ন ম্যাচিং সঙ্গে ere রেগুলার এক্সপ্রেশনের =~, এবং হ্যাঁ, স্ট্রিং-বিভাজন দমন এবং ফাইলসিস্টেম globbing) হতে হবে পাওয়া যায়। যেহেতু [[পুরোপুরি নন-পসিক্স সিনট্যাক্স, তাই এটি ধরে নিয়ে কোনও অতিরিক্ত বহনযোগ্যতা হ্রাস নেই যে এর বৈশিষ্ট্যগুলির সাথে এটি জন্ম নিয়েছিল তা উপলব্ধ থাকবে।
চার্লস ডফি

1
@DJCrashdummy ... লিংক আপনি পয়েন্ট আউট সঠিকভাবে দেন কোট কখনও কখনও উপর যে হল প্রয়োজন ডানদিকে এর [[ $var = $pattern ]], যদি আপনি চান কি অন্যথায় পরিবর্তে একটি আক্ষরিক স্ট্রিং হিসেবে ব্যাখ্যা করা যেতে একটি fnmatch প্যাটার্ন হিসেবে ব্যাখ্যা করা হবে। স্ট্রিংটির fooকোনও আক্ষরিক ব্যাখ্যা নেই, যা উদ্ধৃতিগুলি সম্পূর্ণ নিরাপদ করে দিয়েছে; এটি কেবলমাত্র যদি ওপি ম্যাচ করতে চায়, বলুন foo*(অক্ষরেখার সাথে আক্ষরিক হিসাবে, স্ট্রিংয়ের পরে আসতে পারে এমন কোনও অর্থ নয় foo) যে উদ্ধৃতি বা পলায়নের প্রয়োজন হবে।
চার্লস ডাফি 21

@ চার্লসডুফি দুর্ভাগ্যক্রমে আমার কোন ধারণা নেই যে আপনি কী উল্লেখ করছেন, কারণ আমার মন্তব্য মুছে ফেলা হয়েছে এবং আমি মনে করতে পারি না কারণ এটি বেশ সময় হয়ে গেছে। :-(
ডিজে ক্র্যাশডমি

@ ডিজে ক্র্যাশডমি, ... হু, আমি ধরে নিয়েছি আপনি নিজেই তা প্রত্যাহার করে নিবেন। মূলত, এটি বাশিজম [[হওয়ার অভ্যন্তরে অব্যবহৃত বিস্তৃতি সম্পর্কে আপত্তি ছিল (এটি নির্দেশ করে যে আপনি কেবল উত্তরটি +1 দিচ্ছিলেন না কারণ এটিই ছিল)।
চার্লস ডাফি

@ চার্লস ডফি না, এটির একমাত্র কারণ নয়: সরল কাজের জন্য আমি বাশ-ইসেমস, কেএসএএসএস ইত্যাদি পছন্দ করি না (তারপরে এটি কেবল ঝামেলা সৃষ্টি করে এবং প্রথমদিকে বিভ্রান্ত করে তোলে), কেন আমি একক মিশ্রণ তা পাই না ধনুর্বন্ধনী [ ... ]এবং ডাবল সমান চিহ্ন ==। : - /
ডিজেক্র্যাশডমি

27

এটি অপারেটরের চারপাশে টেস্ট কনস্ট্রাক্টের উপর নির্ভর করে । আপনার বিকল্পগুলি হ'ল ডাবল বন্ধনী, ডাবল বন্ধনী, একক ধনুর্বন্ধনী, বা পরীক্ষা

আপনি যদি ((...)) ব্যবহার করেন , আপনি ==সি হিসাবে যেমন পাটিগণিত ইক্যুইটি পরীক্ষা করছেন :

$ (( 1==1 )); echo $?
0
$ (( 1==2 )); echo $?
1

(দ্রষ্টব্য: 0মানে trueইউনিক্স ইন্দ্রিয় এবং অ শূন্য মধ্যে একটি ব্যর্থ পরীক্ষা)

-eqডাবল প্রথম বন্ধনীর ভিতরে ব্যবহার করা একটি বাক্য গঠন ত্রুটি।

আপনি যদি [...] (বা একক ব্রেস) বা [[... ...]] (বা ডাবল ব্রেস) testব্যবহার করেন , বা আপনি -eq, -ne, -lt, -le, -gt, বা একটি ব্যবহার করতে পারেন একটি গাণিতিক তুলনা হিসাবে ।

$ [ 1 -eq 1 ]; echo $?
0
$ [ 1 -eq 2 ]; echo $?
1
$ test 1 -eq 1; echo $?
0

==একক বা ডবল ধনুর্বন্ধনী (অথবা ভেতরে testকমান্ড) অন্যতম স্ট্রিং তুলনা অপারেটরদের :

$ [[ "abc" == "abc" ]]; echo $?
0
$ [[ "abc" == "ABC" ]]; echo $?
1

স্ট্রিং অপারেটর হিসাবে, তার চারপাশে বা এটির প্রয়োজনীয় সাদা অংশটির =সমতুল্য ==এবং নোট করুন ।===

আপনি যখন এটি করতে পারেন [[ 1 == 1 ]]বা [[ $(( 1+1 )) == 2 ]]এটি স্ট্রিং সমতা পরীক্ষা করছে - পাটিগণিত সমতা নয়।

সুতরাং -eqফলাফলটি সম্ভবত প্রত্যাশিত হয়েছিল যে পূর্ণসংখ্যার মানটি আরএইচ একটি স্ট্রিং এবং পেছনের স্থান থাকা সত্ত্বেও 1+1সমান 2:

$ [[ $(( 1+1 )) -eq  "2 " ]]; echo $?
0

একই সাথে একটি স্ট্রিং তুলনা পেছনের স্থানটি তুলে তোলে এবং তার জন্য স্ট্রিং তুলনা ব্যর্থ হয়:

$ [[ $(( 1+1 )) ==  "2 " ]]; echo $?
1

এবং একটি ভুল স্ট্রিং তুলনা সম্পূর্ণ ভুল উত্তর উত্পাদন করতে পারে। '10' অভিধানের তুলনায় '2' এর চেয়ে কম, সুতরাং একটি স্ট্রিং তুলনা ফিরে আসে trueবা 0। অনেকগুলি এই বাগ দ্বারা কামড়েছে:

$ [[ 10 < 2 ]]; echo $?
0

গাণিতিকভাবে 2 এর চেয়ে কম হওয়ার জন্য 10 এর সঠিক পরীক্ষা বনাম :

$ [[ 10 -lt 2 ]]; echo $?
1

মন্তব্যে, স্ট্রিংগুলিতে পূর্ণসংখ্যা ফেরতের প্রযুক্তিগত কারণ নিয়ে প্রশ্ন রয়েছে -eqযা একই নয় তার জন্য সত্য:

$ [[ "yes" -eq "no" ]]; echo $?
0

কারণটি হ'ল বাশটি টাইপড নয়-eqকারণ স্ট্রিং পূর্ণসংখ্যার হিসেবে ব্যাখ্যা করা সম্ভব হলে বেস রূপান্তর অন্তর্ভুক্ত রয়েছে:

$ [[ "0x10" -eq 16 ]]; echo $?
0
$ [[ "010" -eq 8 ]]; echo $?
0
$ [[ "100" -eq 100 ]]; echo $?
0

এবং 0যদি বাশ মনে করে যে এটি কেবল একটি স্ট্রিং:

$ [[ "yes" -eq 0 ]]; echo $?
0
$ [[ "yes" -eq 1 ]]; echo $?
1

সুতরাং [[ "yes" -eq "no" ]]সমতূল্য[[ 0 -eq 0 ]]

শেষ দ্রষ্টব্য: টেস্ট কনস্ট্রাক্টসের অনেকগুলি নির্দিষ্ট বাছাই পসিক্স নয় এবং তাই অন্যান্য শেলগুলিতে ব্যর্থ হবে। অন্যান্য শেলগুলি সাধারণত সমর্থন করে না [[...]]এবং ((...))বা==


আমি কৌতুহলী প্রযুক্তিগত কারণে জন্য [[ "yes" -eq "no" ]]ট্রু ফিরিয়ে আনে। বাশ কীভাবে এই স্ট্রিংগুলিকে পূর্ণসংখ্যার মানগুলির সাথে তুলনা করতে বাধ্য করে? ;-)
অদ্ভুত

4
বাশ ভেরিয়েবলগুলি টাইপযুক্ত নয় তাই [[ "yes" -eq "no" ]]সমান [[ "yes" -eq 0 ]] বা [[ "yes" -eq "any_noninteger_string" ]]- সমস্ত সত্য। -eqবাহিনী তুলনা পূর্ণসংখ্যা। "yes"একটি পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করা হয় 0; অন্য পূর্ণসংখ্যা হয় 0বা স্ট্রিং ফলাফল হলে তুলনাটি সত্য 0
Dawg

বু, হিস পুনরায়: ==কোড নমুনায় দেখানো (ননপোর্টেবল) এবং নীচে কেবল উল্লেখযোগ্য (পোর্টেবল, মানকৃত) =
চার্লস ডাফি

24

==এটি একটি বাশ-নির্দিষ্ট উপনাম =এবং এটি একটি সংখ্যার তুলনার পরিবর্তে একটি স্ট্রিং (লেজিকাল) তুলনা করে। eqঅবশ্যই একটি সংখ্যার তুলনা হচ্ছে।

অবশেষে, আমি সাধারণত ফর্মটি ব্যবহার করতে পছন্দ করি if [ "$a" == "$b" ]


15
==এখানে =পসইক্স দ্বারা নির্দিষ্ট হিসাবে এখানে ব্যবহার করা খারাপ ফর্ম ।
চার্লস ডাফি

9
আপনি কি সত্যিই ব্যবহার করতে পীড়াপীড়ি যদি ==তারপরে এর মধ্যে এটা করা [[এবং ]]। (এবং নিশ্চিত করুন যে আপনার স্ক্রিপ্টের প্রথম লাইনটি ব্যবহারের জন্য নির্দিষ্ট করে /bin/bash))
হোলজেরো

18

বন্ধুরা: বেশ কয়েকটি উত্তর বিপজ্জনক উদাহরণ দেখায়। [ $a == $b ]ওপির উদাহরণটিতে বিশেষভাবে অব্যবহৃত ভেরিয়েবল বিকল্প ব্যবহার করা হয়েছে (অক্টোবর '17 এর সম্পাদনা হিসাবে)। জন্য [...]যে স্ট্রিং সমতার জন্য নিরাপদ।

তবে আপনি যদি বিকল্পগুলি গণনা করতে চলেছেন তবে আপনাকে [[...]]অবশ্যই অবহিত করতে হবে যে ডান হাতের অংশটি উদ্ধৃত করা উচিত। যদি উদ্ধৃতি না দেওয়া হয় তবে এটি একটি প্যাটার্ন ম্যাচ! (বাশ ম্যান পৃষ্ঠা থেকে: "প্যাটার্নের কোনও অংশই স্ট্রিং হিসাবে মিলে যেতে বাধ্য করার জন্য উদ্ধৃত করা যেতে পারে" ")।

এখানে বাশ-এ দুটি হ'ল "হ্যাঁ" ফলন হ'ল প্যাটার্ন ম্যাচিং, অন্য তিনটি স্ট্রিং সমতা:

$ rht="A*"
$ lft="AB"
$ [ $lft = $rht ] && echo yes
$ [ $lft == $rht ] && echo yes
$ [[ $lft = $rht ]] && echo yes
yes
$ [[ $lft == $rht ]] && echo yes
yes
$ [[ $lft == "$rht" ]] && echo yes
$

2
সমতার জন্য এমনকি নির্ভরযোগ্য হতে [ "$lht" = "$rht" ] উদ্ধৃতিগুলির সাথে থাকা প্রয়োজন । যদি আপনার সাথে ফাইল তৈরি করা থাকে touch 'Afoo -o AB', [ $lft = $rht ]তবে ফাইলটির নামটি একেবারে অভিন্ন নয় , সত্য হয়ে যাবে AB
চার্লস ডাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.