কেউ দয়া করে বাশ স্ক্রিপ্টিংয়ের মধ্যে -eq
এবং পার্থক্যটি ব্যাখ্যা করতে পারেন ==
?
নিম্নলিখিতগুলির মধ্যে কোনও পার্থক্য আছে কি?
[ $a -eq $b ]
এবং [ $a == $b ]
==
ভেরিয়েবলের সংখ্যা থাকাতে এটি কী কেবল ব্যবহার করা হয়?
কেউ দয়া করে বাশ স্ক্রিপ্টিংয়ের মধ্যে -eq
এবং পার্থক্যটি ব্যাখ্যা করতে পারেন ==
?
নিম্নলিখিতগুলির মধ্যে কোনও পার্থক্য আছে কি?
[ $a -eq $b ]
এবং [ $a == $b ]
==
ভেরিয়েবলের সংখ্যা থাকাতে এটি কী কেবল ব্যবহার করা হয়?
উত্তর:
এটি অন্য উপায়ে: =
এবং ==
স্ট্রিং তুলনার -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
আরো দেখুন:
[[ $var = $pattern ]]
, যদি আপনি চান কি অন্যথায় পরিবর্তে একটি আক্ষরিক স্ট্রিং হিসেবে ব্যাখ্যা করা যেতে একটি fnmatch প্যাটার্ন হিসেবে ব্যাখ্যা করা হবে। স্ট্রিংটির foo
কোনও আক্ষরিক ব্যাখ্যা নেই, যা উদ্ধৃতিগুলি সম্পূর্ণ নিরাপদ করে দিয়েছে; এটি কেবলমাত্র যদি ওপি ম্যাচ করতে চায়, বলুন foo*
(অক্ষরেখার সাথে আক্ষরিক হিসাবে, স্ট্রিংয়ের পরে আসতে পারে এমন কোনও অর্থ নয় foo
) যে উদ্ধৃতি বা পলায়নের প্রয়োজন হবে।
[[
হওয়ার অভ্যন্তরে অব্যবহৃত বিস্তৃতি সম্পর্কে আপত্তি ছিল (এটি নির্দেশ করে যে আপনি কেবল উত্তরটি +1 দিচ্ছিলেন না কারণ এটিই ছিল)।
[ ... ]
এবং ডাবল সমান চিহ্ন ==
। : - /
এটি অপারেটরের চারপাশে টেস্ট কনস্ট্রাক্টের উপর নির্ভর করে । আপনার বিকল্পগুলি হ'ল ডাবল বন্ধনী, ডাবল বন্ধনী, একক ধনুর্বন্ধনী, বা পরীক্ষা
আপনি যদি ((...)) ব্যবহার করেন , আপনি ==
সি হিসাবে যেমন পাটিগণিত ইক্যুইটি পরীক্ষা করছেন :
$ (( 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" ]]
ট্রু ফিরিয়ে আনে। বাশ কীভাবে এই স্ট্রিংগুলিকে পূর্ণসংখ্যার মানগুলির সাথে তুলনা করতে বাধ্য করে? ;-)
[[ "yes" -eq "no" ]]
সমান [[ "yes" -eq 0 ]]
বা [[ "yes" -eq "any_noninteger_string" ]]
- সমস্ত সত্য। -eq
বাহিনী তুলনা পূর্ণসংখ্যা। "yes"
একটি পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করা হয় 0
; অন্য পূর্ণসংখ্যা হয় 0
বা স্ট্রিং ফলাফল হলে তুলনাটি সত্য 0
।
==
কোড নমুনায় দেখানো (ননপোর্টেবল) এবং নীচে কেবল উল্লেখযোগ্য (পোর্টেবল, মানকৃত) =
।
==
এটি একটি বাশ-নির্দিষ্ট উপনাম =
এবং এটি একটি সংখ্যার তুলনার পরিবর্তে একটি স্ট্রিং (লেজিকাল) তুলনা করে। eq
অবশ্যই একটি সংখ্যার তুলনা হচ্ছে।
অবশেষে, আমি সাধারণত ফর্মটি ব্যবহার করতে পছন্দ করি if [ "$a" == "$b" ]
==
এখানে =
পসইক্স দ্বারা নির্দিষ্ট হিসাবে এখানে ব্যবহার করা খারাপ ফর্ম ।
==
তারপরে এর মধ্যে এটা করা [[
এবং ]]
। (এবং নিশ্চিত করুন যে আপনার স্ক্রিপ্টের প্রথম লাইনটি ব্যবহারের জন্য নির্দিষ্ট করে /bin/bash
))
বন্ধুরা: বেশ কয়েকটি উত্তর বিপজ্জনক উদাহরণ দেখায়। [ $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
$
[ "$lht" = "$rht" ]
উদ্ধৃতিগুলির সাথে থাকা প্রয়োজন । যদি আপনার সাথে ফাইল তৈরি করা থাকে touch 'Afoo -o AB'
, [ $lft = $rht ]
তবে ফাইলটির নামটি একেবারে অভিন্ন নয় , সত্য হয়ে যাবে AB
।
[[
সামগ্রিকভাবে বাশ (এবং আরও অনেকগুলি শাঁস) গৃহীত একটি 1980-এর যুগের খস-ইসম। যে পুরো পয়েন্ট - আপনি আছে যদি[[
এ সব , তাহলে আপনি নিরাপদে অনুমান করতে পারেন ksh যে সকল এক্সটেনশান এটি প্রায় (বাস্তবায়িতfnmatch()
-style প্যাটার্ন ম্যাচিং সঙ্গে ere রেগুলার এক্সপ্রেশনের=~
, এবং হ্যাঁ, স্ট্রিং-বিভাজন দমন এবং ফাইলসিস্টেম globbing) হতে হবে পাওয়া যায়। যেহেতু[[
পুরোপুরি নন-পসিক্স সিনট্যাক্স, তাই এটি ধরে নিয়ে কোনও অতিরিক্ত বহনযোগ্যতা হ্রাস নেই যে এর বৈশিষ্ট্যগুলির সাথে এটি জন্ম নিয়েছিল তা উপলব্ধ থাকবে।