ব্যাশে ডাবল এবং একক বর্গাকার বন্ধনীগুলির মধ্যে পার্থক্য কী?


426

আমি ঠিক ভাবলাম ঠিক কি মধ্যে পার্থক্য

[[ $STRING != foo ]]

এবং

[ $STRING != foo ]

এটি বাদে প্যাসিক্স-কমপ্লায়েন্ট, শের মধ্যে পাওয়া যায় এবং পূর্ববর্তীটি ব্যাশের মধ্যে পাওয়া এক্সটেনশন।


1
আপনি যদি কোনও ব্র্যাকেট ব্যবহার না করার বিষয়েও ভাবছিলেন তবে উদাহরণস্বরূপ একটি ifবিবৃতি প্রসঙ্গে mywiki.wooledge.org/BashPitfalls#if_.5Bgrep_foo_myfile.5D
কেভ

এছাড়াও, উবুন্টুর ডক্স থেকে: wiki.ubuntu.com/…
রেডিসটো

উত্তর:


309

বিভিন্ন পার্থক্য আছে। আমার মতে, কয়েকটি অতি গুরুত্বপূর্ণ:

  1. [বাশ এবং অন্যান্য অনেক আধুনিক শেলের একটি অন্তর্নির্মিত। বিল্টিনটি বন্ধ হওয়ার অতিরিক্ত প্রয়োজনীয়তার সাথে [সমান । বিল্টিনগুলি এবং কার্যকারিতা এবং তাদের সীমাবদ্ধতার সাথে অনুকরণ করে যাতে স্ক্রিপ্টগুলি পিছনের দিকে সামঞ্জস্যপূর্ণ হয়। মূল এক্সিকিউটেবলগুলি এখনও বেশিরভাগই পসিক্স সম্মতি এবং পিছনে সামঞ্জস্যের জন্য বিদ্যমান exist কমান্ডটি বাশ-এ চালানো ইঙ্গিত দেয় যে এটি বিল্টিন হিসাবে ডিফল্টরূপে ব্যাখ্যা করা হয়। (দ্রষ্টব্য: কেবল PATH এ এক্সিকিউটেবলের সন্ধান করে এবং এর সমতুল্য )test][test/bin/[/bin/testtype [[which [type -p [
  2. [[হিসাবে সামঞ্জস্যপূর্ণ না, এটি অগত্যা যা /bin/shপয়েন্ট যাই হোক না কেন সঙ্গে কাজ করবে না । তাই [[আরো আধুনিক ব্যাশ / Zsh / ksh বিকল্প।
  3. যেহেতু [[শেলটি তৈরি করা হয়েছে এবং এর উত্তরাধিকার প্রয়োজনীয়তা নেই, তাই স্পেসের সাথে একটি স্ট্রিংয়ের মূল্যায়নকারী ভেরিয়েবলগুলিতে বিড়বিড় করতে আইএফএস ভেরিয়েবলের ভিত্তিতে শব্দ বিভাজন সম্পর্কে আপনার চিন্তা করার দরকার নেই । অতএব, আপনার সত্যিকারের ডাবল উদ্ধৃতিতে ভেরিয়েবল রাখার দরকার নেই।

বেশিরভাগ অংশের জন্য, বাকীটি কেবল কিছু ভাল সিনট্যাক্স। আরও পার্থক্য দেখতে, আমি একটি FAQ উত্তরের এই লিঙ্কটি সুপারিশ করছি: পরীক্ষার মধ্যে [এবং [[[এর মধ্যে পার্থক্য কী? । আসলে, আপনি যদি বাশ স্ক্রিপ্টিং সম্পর্কে গুরুতর হন তবে আমি FAQ, পিটফলস এবং গাইড সহ পুরো উইকিটি পড়ার পরামর্শ দিচ্ছি । গাইড বিভাগের পরীক্ষার বিভাগটিও এই পার্থক্যগুলি ব্যাখ্যা করে এবং লেখক (গুলি) কেন পোর্টেবল হওয়ার বিষয়ে আপনার যদি চিন্তা করার দরকার না হয় তবে কেন এটি একটি ভাল পছন্দ। প্রধান কারণগুলি হ'ল:[[

  1. আপনাকে পরীক্ষার বাম দিকের উদ্ধৃতি দেওয়ার বিষয়ে চিন্তা করার দরকার নেই যাতে এটি আসলে একটি চলক হিসাবে পড়ে read
  2. < >ইনপুট পুনঃনির্দেশ হিসাবে মূল্যায়ন না করার জন্য আপনার ব্যাকস্ল্যাশগুলির চেয়ে কম বা তার চেয়ে বেশি পালাতে হবে না , যা ফাইলগুলিকে ওভাররাইট করে কিছু জিনিস সত্যিই গণ্ডগোল করতে পারে। এটি আবার [[বিল্টিন হয়ে ফিরে যায় । যদি [(পরীক্ষা) একটি বাহ্যিক প্রোগ্রাম হয় তবে শেলটিকে যেমন মূল্যায়ন করা হয় তার ব্যতিক্রম করতে হবে <এবং >কেবল যদি /bin/testডাকা হয় তখন এটি সত্যিকার অর্থে আসে না।

5
ধন্যবাদ, বাশ এফএকিউর লিঙ্কটি আমি যা খুঁজছিলাম তা ছিল (এই পৃষ্ঠাটি সম্পর্কে জানেনি, ধন্যবাদ)।
0x89

2
এই তথ্যটি দিয়ে আমি আপনার পোস্ট সম্পাদনা করেছি, তবে [এবং পরীক্ষাটি বিল্টইন হিসাবে কার্যকর করা হয়েছে। বিল্টিনগুলি / বিন / [এবং / বিন / পরীক্ষা প্রতিস্থাপনের জন্য ডিজাইন করা হয়েছিল তবে বাইনারিগুলির সীমাবদ্ধতাগুলিও পুনরুত্পাদন করা প্রয়োজন। কমান্ড 'প্রকার [' যাচাই করে যে বিল্টিনটি ব্যবহৃত হয়েছে। 'যা [' PATH এ কেবল এক্সিকিউটেবলের জন্য অনুসন্ধান করে এবং 'টাইপ
পি

133

সংক্ষেপে:

[বাশ বিল্টিন ilt

[[]] হ'ল বাশ কীওয়ার্ড

কীওয়ার্ডস: কীওয়ার্ডগুলি বিল্টিনের মতো তবে মূল পার্থক্য হ'ল বিশেষ পার্সিং বিধিগুলি তাদের জন্য প্রযোজ্য। উদাহরণস্বরূপ, [হ'ল ব্যাশ বিল্টিন, যখন [[বাশ কীওয়ার্ড। এগুলি উভয়ই স্টাফ টেস্টিংয়ের জন্য ব্যবহৃত হয়, তবে যেহেতু [[বিল্টিনের পরিবর্তে একটি মূলশব্দ তাই এটি কয়েকটি বিশেষ পার্সিং বিধি থেকে উপকৃত হয় যা এটিকে অনেক সহজ করে তোলে:

  $ [ a < b ]
 -bash: b: No such file or directory
  $ [[ a < b ]]

প্রথম উদাহরণটি একটি ত্রুটি দেয় কারণ বাশ ফাইলটি বি কমান্ড [এ] -এ পুনর্নির্দেশের চেষ্টা করে। দ্বিতীয় উদাহরণটি বাস্তবে আপনি যা আশা করেন তা করে does <অক্ষরটির আর ফাইল পুনঃনির্দেশ অপারেটরের বিশেষ অর্থ নেই।

সূত্র: http://mywiki.wooledge.org/BashGuide/CommandsAndArguments


3
[একটি পসিক্স শেল কমান্ড; এটি অন্তর্নির্মিত হওয়া দরকার না ]just কেবল একটি আর্গুমেন্ট যা সেই আদেশটি সন্ধান করে, যাতে বাক্য গঠনটি ভারসাম্যপূর্ণ হয়। কমান্ডটি একটি সমার্থক শব্দ testছাড়া এটি testবন্ধ হওয়ার সন্ধান করে না ]
কাজ


81

আচরণের পার্থক্য

4.3.11 বাশে কিছু পার্থক্য:

  • পসিক্স বনাম বাশ এক্সটেনশান:

  • নিয়মিত কমান্ড বনাম যাদু

    • [ একটি অদ্ভুত নাম সহ একটি নিয়মিত আদেশ।

      ]এটি কেবলমাত্র একটি যুক্তিই হ'ল [আরও যুক্তি ব্যবহার করা থেকে বাধা দেয়।

      কোরবানিলগুলি সরবরাহ করে উবুন্টু ১.0.০৪ এর পক্ষে এটির জন্য আসলে একটি এক্সিকিউটেবল থাকে /usr/bin/[, তবে ব্যাশ অন্তর্নির্মিত সংস্করণটিকে প্রাধান্য দেয়।

      বাশ যেভাবে কমান্ডটি পার্স করে তাতে কিছুই পরিবর্তন হয় না।

      বিশেষত, <পুনঃনির্দেশ, &&এবং ||একাধিক কমান্ডকে ( )একত্রিত করা , সাবস্কেল জেনারেট করে যদি না এড়িয়ে যায় \এবং শব্দ প্রসারণটি যথারীতি ঘটে।

    • [[ X ]]এটি একটি একক নির্মাণ যা Xযাদুতে পার্স করা যায়। <, &&, ||এবং ()বিশেষভাবে চিকিত্সা করা হয়, এবং শব্দ বিভাজন নিয়ম ভিন্ন।

      মত =এবং আরও পার্থক্য আছে =~

      বাশেসে: [একটি অন্তর্নির্মিত কমান্ড, এবং [[এটি একটি কীওয়ার্ড: https://askubuntu.com/questions/445749/what-the-differences-between- Shell - builtin- and- shell - keyword

  • <

  • && এবং ||

    • [[ a = a && b = b ]]: সত্য, যৌক্তিক এবং
    • [ a = a && b = b ]: সিনট্যাক্স ত্রুটি, &&একটি এবং কমান্ড বিভাজক হিসাবে পার্স করা হয়েছেcmd1 && cmd2
    • [ a = a -a b = b ]সমতুল্য, তবে POSIX³ দ্বারা অবচয় ³
    • [ a = a ] && [ b = b ]: পসিক্স এবং নির্ভরযোগ্য সমতুল্য
  • (

    • [[ (a = a || a = b) && a = b ]]: মিথ্যা
    • [ ( a = a ) ]: সিনট্যাক্স ত্রুটি, ()সাবসেল হিসাবে ব্যাখ্যা করা হয়
    • [ \( a = a -o a = b \) -a a = b ]সমতুল্য, তবে ()পসিক্স দ্বারা হ্রাস করা হয়
    • { [ a = a ] || [ a = b ]; } && [ a = b ]পসিক্স সমতুল্য 5
  • শব্দের বিভাজন এবং ফাইলের নাম উত্পাদন প্রসারণ (স্প্লিট + গ্লোব)

    • x='a b'; [[ $x = 'a b' ]]: সত্য, উদ্ধৃতি প্রয়োজন নেই
    • x='a b'; [ $x = 'a b' ]: সিনট্যাক্স ত্রুটি, প্রসারিত হয় [ a b = 'a b' ]
    • x='*'; [ $x = 'a b' ]: বর্তমান ডিরেক্টরিতে একাধিক ফাইল থাকলে সিনট্যাক্স ত্রুটি।
    • x='a b'; [ "$x" = 'a b' ]: পসিক্স সমতুল্য
  • =

    • [[ ab = a? ]]: সত্য, কারণ এটি প্যাটার্ন ম্যাচিং করে ( * ? [ম্যাজিক হয়)। বর্তমান ডিরেক্টরিতে ফাইলগুলিতে গ্লোব প্রসারিত হয় না।
    • [ ab = a? ]: a?গ্লোব প্রসারিত। সুতরাং বর্তমান ডিরেক্টরিতে থাকা ফাইলগুলির উপর নির্ভর করে সত্য বা মিথ্যা হতে পারে।
    • [ ab = a\? ]: মিথ্যা, গ্লোব সম্প্রসারণ নয়
    • =এবং ==উভয় একই [এবং [[কিন্তু ==একটি ব্যাশ এক্সটেনশান।
    • case ab in (a?) echo match; esac: পসিক্স সমতুল্য
    • [[ ab =~ 'ab?' ]]: মিথ্যা 4 , এর সাথে ম্যাজিক হারায়''
    • [[ ab? =~ 'ab?' ]]: সত্য
  • =~

    • [[ ab =~ ab? ]]: সত্য, POSIX প্রসারিত নিয়মিত অভিব্যক্তি ম্যাচ, ?গ্লোব বিস্তৃত হয় না
    • [ a =~ a ]: বাক্যগঠন ত্রুটি. বাশের সমতুল্য নয়।
    • printf 'ab\n' | grep -Eq 'ab?': পসিক্স সমতুল্য (শুধুমাত্র একক লাইন ডেটা)
    • awk 'BEGIN{exit !(ARGV[1] ~ ARGV[2])}' ab 'ab?': পসিক্স সমতুল্য।

প্রস্তাবনা : সর্বদা ব্যবহার []

[[ ]]আমার দেখা প্রতিটি নির্মাণের জন্য পসিক্স সমতুল্য রয়েছে ।

আপনি যদি ব্যবহার করেন [[ ]]:

  • বহনযোগ্যতা হারাতে
  • পাঠককে অন্য ব্যাশ এক্সটেনশনের জটিলতা শিখতে বাধ্য করুন। [একটি অদ্ভুত নাম সহ একটি নিয়মিত কমান্ড, কোনও বিশেষ শব্দার্থ জড়িত নয়।

Orn [[...]]কর্ন শেলের সমতুল্য নির্মাণ থেকে অনুপ্রাণিত

² তবে কিছু মান aবা b(যেমন +বা index) এর জন্য ব্যর্থ হয় এবং সংখ্যাসূচক তুলনা করে aএবং যদি bদশমিক পূর্ণসংখ্যার মতো দেখায়। expr "x$a" '<' "x$b"উভয় কাছাকাছি কাজ করে।

³ এবং কিছু মানের জন্য ব্যর্থ হয় aবা bমত !বা (

ব্যাশ ৩.২ এবং তারপরে 4 এবং ব্যাশ 3.1 এর সাথে সামঞ্জস্যতা সরবরাহ করা সক্ষম করা নেই (এর মতো BASH_COMPAT=3.1)

5 যদিও গোষ্ঠী (এখানে দিয়ে {...;}কমান্ড দল পরিবর্তে (...)যা অপ্রয়োজনীয় subshell চালানো হবে) প্রয়োজনীয় হিসাবে নয় ||এবং &&শেল অপারেটার (যেমন বিরোধিতা ||এবং && [[...]]অপারেটরদের বা -o/ -a [অপারেটরদের) সমান প্রাধান্য আছে। সুতরাং [ a = a ] || [ a = b ] && [ a = b ]সমতুল্য হবে।


কিভাবে ব্যবহার printf 'ab' | grep -Eq 'ab?'মধ্যে if [ … ]?
meeDamian

1
@meeDamian if ( printf 'ab' | grep -Eq 'a' ); then echo 'a'; fi[]ঠিক যেমন একটি আদেশ grep()যে কমান্ড আবশ্যক নাও হতে পারে আমি নিশ্চিত নই: আমি কারণ এটি যোগ |, কিভাবে ব্যাশ জিনিষ parses উপর নির্ভর করে। যদি কিছু না থাকে তবে |আমি নিশ্চিত যে আপনি কেবল লিখতে পারেন if cmd arg arg; then
সিরো সান্তিলি 新疆 改造 中心 法轮功 六四

1
@meeDamian হাঁ, জন্য কোন প্রয়োজন ()মনে হয়: stackoverflow.com/questions/8965509/...
সিরো Santilli新疆改造中心法轮功六四事件

1
দুর্দান্ত তালিকা! আরও দেখুন: wiki.ubuntu.com/…
Radistao

5

একক ব্র্যাকেট অর্থাত []শর্তসাপেক্ষ এক্সপ্রেশন বন্ধ করার জন্য পসিক্স শেল।

ডাবল বন্ধনী অর্থাত [[]], এই ব্যাশ এবং অন্যান্য শাঁস (zsh, ksh) দ্বারা সমর্থিত একটি বর্ধিত (অথবা এক্সটেনশন) মান POSIX সংস্করণের সংস্করণ।

ব্যাশ সালে সাংখ্যিক তুলনা আমরা ব্যবহার জন্য eq, ne, ltএবং gtতুলনা জন্য ডবল বন্ধনী সঙ্গে, আমরা ব্যবহার করতে পারি ==, !=, <,এবং >আক্ষরিক।

  • [পরীক্ষা কমান্ডের প্রতিশব্দ। এমনকি যদি এটি শেলের সাথে অন্তর্নির্মিত হয় তবে এটি একটি নতুন প্রক্রিয়া তৈরি করে।
  • [[ এটির একটি নতুন উন্নত সংস্করণ যা একটি কীওয়ার্ড, কোনও প্রোগ্রাম নয়।

উদাহরণ স্বরূপ:

[ var1 lt var2] #works
[ var1 < var2] #error: var2 No such file or directory 
[ var1 \< var2] #works with escape
[[ var1 < var2]] #works

4

র manpage প্রাসঙ্গিক অংশগুলি একটি দ্রুত পড়া উপর ভিত্তি করে, মূল পার্থক্য উপস্থিত হতে পারে যে ==এবং !=সেখানে একটি আক্ষরিক স্ট্রিং একটি প্যাটার্ন বিরুদ্ধে অপারেটার ম্যাচ বদলে, এবং এছাড়াও যে =~Regex তুলনা অপারেটর।

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