বাশ: বনাম-দ্বিগুণ সমান


47

আমি ব্যাশে পূর্ণসংখ্যার তুলনা করছি (ব্যবহারকারী রুট হিসাবে চলমান কিনা তা দেখার চেষ্টা করে) এবং আমি এটি করার দুটি ভিন্ন উপায় পেয়েছি:

দ্বিগুণ সমান:

if [ $UID == 0 ]
then
fi

-eq

if [ $UID -eq 0 ]
then
fi

আমি বুঝতে পারি যে কোনও ধরণের> = বা <= বাশ নেই, কেবল-ও-ও-লে, সুতরাং সেখানে ==যদি একটি থাকে কেন -eq?

এটি উভয় পক্ষের সাথে যেভাবে তুলনা করে তাতে কোনও পার্থক্য রয়েছে?


3
মনে রাখবেন যে, বন্ধনী ভিতরে স্পেস প্রয়োজন: [ $UID -eq 0 ]না [ $UID -eq 0]
গিলস 'এস-অশুভ হওয়া বন্ধ করুন'

উত্তর:


50

==bashএটির জন্য একটি স্পেসিফিক ওরফে =, যা -eqসংখ্যার তুলনার পরিবর্তে একটি স্ট্রিং (লেক্সিকাল) তুলনা করে । (এটি পার্ল থেকে পিছনের দিকে: শব্দ-শৈলীর অপারেটরগুলি সংখ্যাসূচক, প্রতীকী শব্দগুলি লাসিক্যাল))


এর অর্থ কি এই যে উভয় পক্ষের পূর্ণসংখ্যা হলে এটি উভয় পক্ষকে স্ট্রিংয়ে রূপান্তর করে এবং তারপরে তুলনা করে?
বেটগ্যামিট

5
আরও স্পষ্টভাবে এটি অন্যান্য উপায়ে: সবকিছুই একটি স্ট্রিং, স্ট্রিংগুলি পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করতে -eqবলে bash( 0কোনও স্ট্রিং সংখ্যাসূচক না হলে সতর্কতা ছাড়াই উত্পাদন করা )।
গাইকোসর

11
@tjameson একটি উদাহরণ দিতে: [ 01 -eq 1 ]কিন্তু [ 01 != 1 ]
গিলস 'এস-অশুভ হওয়া বন্ধ করুন'

3
মনে রাখবেন যে অপারেটর ==হিসাবে [মানহীন এবং ব্যবহার করা উচিত নয়, এটি ব্যাশ-নির্দিষ্ট নয় । এটি ksh দ্বারা প্রবর্তিত হয়েছিল এবং zsh দ্বারা সমর্থিত (যদিও প্রথমটি =উদ্ধৃত করা দরকার), যশ এবং জিএনইউ [ইউটিলিটি (এবং কোনও সিস্টেমে ksh স্ক্রিপ্ট হিসাবে প্রয়োগ করা এমন কোনও উপযোগিতা) অন্তত) by
স্টাফেন চেজেলাস

@ গেকোসৌর আমি বাশ v4.3.42 এর কাছ থেকে একটি সতর্কতা পেয়েছি যদি আমার স্ট্রিং সংখ্যাসূচক নয়: $ if [ "hello" -eq 0 ]; then echo true; fi বাশ: [: হ্যালো: পূর্ণসংখ্যার এক্সপ্রেশন প্রত্যাশিত
অ্যান্ড্রু বেনব্রিজে

13

বল্লোভানের উত্তরের বিস্তারিত জানাতে ...

স্ট্রিংগুলির জন্য কোনও >=বা <=তুলনা অপারেটর নেই । তবে আপনি ((...))সংখ্যার সাথে তুলনা করতে পাটিগণিত কমান্ডের সাহায্যে এগুলি ব্যবহার করতে পারেন ।

এছাড়াও আপনি (অন্যান্য স্ট্রিং তুলনা অপারেটর ব্যাবহার করতে পারেন ==, !=, <, >, কিন্তু না =) পূর্ণসংখ্যার তুলনা যদি আপনি তাদের ভিতরে ব্যবহার ((...))

উদাহরণ

  • উভয় [[ 01 -eq 1 ]]এবং (( 01 == 1 ))পূর্ণসংখ্যার তুলনা। দুটোই সত্য।
  • উভয় [[ 01 == 1 ]]এবং [ 01 = 1 ]স্ট্রিং তুলনা। দুটোই মিথ্যা।
  • উভয় (( 01 -eq 1 ))এবং (( 01 = 1 ))একটি ত্রুটি ফিরে আসবে।

দ্রষ্টব্য: ডাবল বন্ধনী সিনট্যাক্স [[...]]এবং ডাবল বন্ধনী সিনট্যাক্স ((...))সমস্ত শেল দ্বারা সমর্থিত নয়।


1
নোট করুন ( mksh/ zshপসিক্স মোড ব্যতীত (যদিও এটি কোনও পসিক্স বৈশিষ্ট্য নয়)) (( 010 == 10 ))মিথ্যা ফিরবে কারণ 010অষ্টাল সংখ্যা হিসাবে গণ্য হবে (দশমিক in)।
স্টাফেন চেজেলাস

নোট করুন যে বেশিরভাগ test/ [বাস্তবায়নে >=/ <=অপারেটর নেই ( যদিও yashএর [রয়েছে), exprএমন অপারেটর রয়েছে, যদিও এটি গাণিতিক তুলনা করবে যদি আর্গুমেন্ট সংখ্যা হিসাবে স্বীকৃত হয় ( expr 01 '>=' 1সত্য expr X01 '>=' X1প্রত্যাবর্তন করে, মিথ্যা প্রত্যাবর্তন করে)।
স্টাফেন চেজেলাস

7

আপনি যদি পূর্ণসংখ্যার তুলনা করতে চান তবে আপনি (()) আরও ভাল ব্যবহার করতে পারবেন, যেখানে আপনি> = ইত্যাদিও ব্যবহার করতে পারেন

উদাহরণ:

if (( $UID == 0 )); then
   echo "You are root"
else
   echo "You are not root"
fi

অথবা (( UID == 0 ))অথবা (( ! UID ))যে বিষয়ে জন্য। লক্ষ্য করুন ((...))হয় অ-মানক (ক kshএছাড়াও দ্বারা সমর্থিত বৈশিষ্ট্য bashএবং zshবৈচিত্র সহ)।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.