শেল তুলনাতে একক এবং দ্বিগুণ সমান চিহ্ন (=) এর মধ্যে পার্থক্য কী?


28

পড়ুন যে ভিতরে স্ট্রিং তুলনা ifকরার জন্য আমাদের ডাবল বর্গাকার বন্ধনী ব্যবহার করতে হবে। কিছু বই বলে যে তুলনা করা যেতে পারে =। তবে এটিও কাজ ==করে।

#!/bin/bash
a="hello"
b="world"
if [[ $a == $b ]];then
    echo "equal"
fi

তুলনা =এবং এর ==মধ্যে একটি পার্থক্য আছে ?


4
এখানে কোথাও কোন প্রশ্ন আছে? যদি তাই হয়, আমি এটি দেখতে পাচ্ছি না। =জন্য [==জন্য [[
ক্রিস ডাউন

@ ক্রিসডাউন এটি সম্পূর্ণ সত্য নয়।
xdavidliu

@ এক্সডাভিডলিউ কি বিস্তৃত করার যত্ন? এটা অবশ্যই হয় POSIX সম্পর্কে, যাতে কোন বোঝা গেছে অনুযায়ী সত্য ==, যার কারণে আপনি ব্যবহার করা উচিত =সঙ্গে (সমতা) [, এবং ==(প্যাটার্ন ম্যাচিং শব্দার্থবিদ্যা যে উদ্ধৃতি-সচেতন হয়) সঙ্গে [[help testবনাম দেখুন help [[
ক্রিস ডাউন

@ ক্রিসডাউন সম্ভবত "ভুলের জন্য" বলতে যা বোঝায় তা আমি ভুল বুঝছি। যদি "এর জন্য" মানে "কেবলমাত্র এটির সাথে কাজ করে", তবে মন্তব্যটি সত্য নয়, যেহেতু [ foo == foo ] && echo fooঅবশ্যই এটি মুদ্রণ fooকরে যা এর সাথে ==কাজ করে [। যাইহোক, যদি "দ্বারা" আপনার মানে "এর সাথে ব্যবহারের উদ্দেশ্য ছিল", তবে আমার আপত্তি কম হবে।
xdavidliu

@ xdavidliu "নির্দিষ্ট ক্ষেত্রে আপনি" উল্লেখ করছেন এর অর্থ "POSIX দ্বারা সংজ্ঞায়িত" for কেবল এটিকে সুবিধা হিসাবে গ্রহণ করার [[জন্য বাশ হ'ল, এর অর্থ এটি প্রস্তাবিত নয় - আপনি যদি বহনযোগ্যতা বর্জন করে থাকেন তবে প্রথম স্থানে ব্যবহার করুন যা টোকেনাইজেশন, শব্দ বিভাজন ইত্যাদির আরও উল্লেখযোগ্য বোঝাপড়া রয়েছে ...
ক্রিস ডাউন

উত্তর:


28

[[ $a == $b ]]তুলনা নয়, এটি প্যাটার্ন মিলছে। আপনার [[ $a == "$b" ]]বাইট-টু-বাইট সমতার তুলনা প্রয়োজন। সমর্থন করে এমন কোনও শেলের =মতোই (এর মাধ্যমে প্রবর্তিত )।==[[...]]ksh

[[...]]মানক shসিনট্যাক্স নয়। [ কমান্ড মান, এবং মান তুলনা অপারেটর আছে =(যদিও কিছু [বাস্তবায়নের এছাড়াও চিনতে ==)।

যে কোনও কমান্ডের যে কোনও যুক্তিতে যেমন, ভেরিয়েবলগুলি উদ্ধৃত করা আবশ্যক, তাই:

[ "$a" = "$b" ]

স্ট্যান্ডার্ডে sh, প্যাটার্ন মেলানো এর সাথে করা হয় case:

case $a in
  ($b) ...
esac

সম্পূর্ণতার জন্য, অন্যান্য সাম্যতার মতো অপারেটরগুলি আপনি শেল স্ক্রিপ্টগুলিতে আসতে পারেন:

  • [ "$a" -eq "$b" ]: [দশমিক পূর্ণসংখ্যার সংখ্যার তুলনা করতে স্ট্যান্ডার্ড অপারেটর। কিছু [বাস্তবায়ন সংখ্যার চারপাশে ফাঁকা করার অনুমতি দেয়, কেউ কেউ সুনির্দিষ্ট পাটিগণিতের অভিব্যক্তিগুলিকে অনুমতি দেয় তবে এটি পোর্টেবল নয়। বহনযোগ্যভাবে, কেউ তার [ "$((a))" -eq "$((b))" ]জন্য ব্যবহার করতে পারেন । [ "$((a == b))" -ne 0 ]যা মানক সমতুল্য হবে তা দেখুন (এটি POSIXly ব্যতীত, আচরণটি কেবল তখন নির্দিষ্ট করা হয় $aএবং $bএতে পূর্ণসংখ্যার ধ্রুবক থাকে):
  • ((a == b)), Ksh থেকে এবং পাওয়া zshএবং bashসত্য ফেরৎ যদি সঞ্চিত গাণিতিক এক্সপ্রেশন মূল্যায়ন $a-এর মত উৎপাদনের একই সংখ্যক $b। সাধারণত, এটি সংখ্যার তুলনা করার জন্য ব্যবহৃত হয়। লক্ষ্য করুন যে গাণিতিক এক্সপ্রেশনগুলি কীভাবে মূল্যায়ন করা হয় এবং কোন সংখ্যাগুলি সমর্থিত হয় (যেমন বাশ এবং কিছু বাস্তবায়ন / ksh এর সংস্করণগুলি ভাসমান পয়েন্টকে সমর্থন করে না বা নেতৃস্থানীয় শূন্যগুলি অষ্টাল হিসাবে গণ্য করে না) সেগুলির মধ্যে শাঁসের মধ্যে পার্থক্য রয়েছে।

  • expr "$a" = "$b"উভয় অপারেণ্ডকে দশমিক পূর্ণসংখ্যার সংখ্যা হিসাবে চিহ্নিত (কিছু সংখ্যার ফাঁকা অংশকে অনুমতি দেয়), এবং অন্যথায় দুটি স্ট্রিং অপারেটরের একই বাছাইয়ের ক্রম রয়েছে কিনা তা পরীক্ষা করে যদি একটি সংখ্যা তুলনা করে। এছাড়া এর মানের জন্য ব্যর্থ হবে $aবা $bযে exprঅপারেটার পছন্দ (, substr...

  • awk 'BEGIN{exit !(ARGV[1] == ARGV[2])}' "$a" "$b": যদি $aএবং $bসংখ্যার হিসাবে স্বীকৃত হয় (কমপক্ষে দশমিক পূর্ণসংখ্যার এবং ভাসমান পয়েন্ট সংখ্যাগুলি 1.2, -1.5e-4 এর মতো শীর্ষস্থানীয় ট্র্যাকিং ফাঁকা উপেক্ষা করা হয়, কিছুগুলি হেক্সাডেসিমাল, অষ্টাল বা স্বীকৃত কোনও কিছুই স্বীকৃতি দেয় strtod()), তবে একটি সংখ্যার তুলনা করা হয় performed অন্যথায়, বাস্তবায়ন উপর নির্ভর করে, হয় একটি বাইট-টু-বাইট স্ট্রিং তুলনা, বা মত exprএকটি strcoll()তুলনা, যে কিনা তা ব্যবহারকারীকে $aএবং $bসাজানোর একই।

আরো দেখুন:


13

এগুলি ব্যাশের সমতুল্য:

[[ $x == "$y" ]]
[[ $x = "$y" ]]
[ "$x" == "$y" ]
[ "$x" = "$y" ]

প্রথম দুটি $ x ভেরিয়েবল উদ্ধৃত করতে হবে না। বাশের ভিতরে শব্দ বিভাজন এবং পথের নাম প্রসারিত হয় [তবে ভিতরে নয় [[:

$ x='a b'
$ [ -s $x ]
-bash: [: a: binary operator expected
$ [[ -s $x ]]
$ ls
$ [ a = * ]
-bash: [: a: unary operator expected
$ [[ a = * ]]
$ 

[[ $x = "$y" ]]একটি স্ট্রিং তুলনা কিন্তু [[ $x = $y ]]একটি প্যাটার্ন মেলানো এক্সপ্রেশন:

$ y='a*'; [[ aa = "$y" ]]; echo $?
1
$ y='a*'; [[ aa = $y ]]; echo $?
0

-eq কেবলমাত্র পূর্ণসংখ্যার সাথে ব্যবহার করতে বোঝানো হয়:

$ [[ x.x -eq x.x ]]
-bash: [[: x.x: syntax error: invalid arithmetic operator (error token is ".x")
$ x=9; [[ "x" -eq 9 ]]; echo $?
0

আরও দেখুন বাশফিউএইচএ / 031: পরীক্ষার মধ্যে পার্থক্য কী, [এবং [[?

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