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


161

আমি এ সম্পর্কে বাশ উদাহরণগুলি পড়ছি ifতবে কয়েকটি উদাহরণ একক বর্গাকার বন্ধনীতে লেখা রয়েছে:

if [ -f $param ]
then
  #...
fi

ডাবল স্কোয়ার বন্ধনী সহ অন্যরা:

if [[ $? -ne 0 ]]
then
    start looking for errors in yourlog
fi

পার্থক্য কি?


3
আপনি এই প্রশ্নের উত্তরটি দেখে আপনার উত্তর পেতে পারেন: unix.stackexchange.com/questions/3831/…
আমির নাগিজাদেহ

উত্তর:


188

একক []posix অনুবর্তী শর্ত পরীক্ষা শেল হয়।

ডাবল [[]]স্ট্যান্ডার্ডের একটি এক্সটেনশন []এবং বাশ এবং অন্যান্য শেল (যেমন zsh, ksh) দ্বারা সমর্থিত। তারা অতিরিক্ত অপারেশনগুলিকে সমর্থন করে (পাশাপাশি স্ট্যান্ডার্ড পোস্টিক্স অপারেশনগুলি)। উদাহরণস্বরূপ: এর ||পরিবর্তে -oএবং এর সাথে রিজেক্সের মিল =~শর্তসাপেক্ষে নির্মাণ সংক্রান্ত বাশ ম্যানুয়াল বিভাগে পার্থক্যের একটি পূর্ণাঙ্গ তালিকা পাওয়া যাবে ।

[]যখনই আপনি চান আপনার স্ক্রিপ্টটি শেলগুলি জুড়ে পোর্টেবল হতে পারে Use ব্যবহারের [[]]আপনি দ্বারা সমর্থিত নয় শর্তাধীন অভিব্যক্তি চান []এবং না পোর্টেবল হতে হবে।


6
আমি যুক্ত করব যে যদি আপনার স্ক্রিপ্টটি কোনও শেবাং দিয়ে শুরু না হয় যা স্পষ্টভাবে সমর্থন করে এমন শেলটির জন্য অনুরোধ করে [[ ]](উদাহরণস্বরূপ বাশ দিয়ে #!/bin/bashবা #!/usr/bin/env bash), আপনার পোর্টেবল বিকল্পটি ব্যবহার করা উচিত। যে স্ক্রিপ্টগুলি ধরে নিয়েছে / বিন / এস এই জাতীয় এক্সটেনশানগুলিকে সমর্থন করে তা সাম্প্রতিক ডেবিয়ান এবং উবুন্টু রিলিজের মতো ওএসগুলিতে বিভক্ত হবে যেখানে ঘটনাটি নেই।
গর্ডন ডেভিসন

87

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

4.3.11 বাশে পরীক্ষিত:

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

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

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

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

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

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

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

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

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

      বাশেসে: [একটি অন্তর্নির্মিত কমান্ড, এবং [[এটি একটি কীওয়ার্ড: /ubuntu/445749/whats-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 ]সমতুল্য হবে।


3
" আমি দেখেছি প্রত্যেকটি [[]] নির্মানের জন্য পসিক্স সমতুল্য রয়েছে। " গ্রহের মুখের কোনও টিউরিং সম্পূর্ণ ভাষা সম্পর্কে একই কথা বলা যেতে পারে ।
এ। রিক

3
@ এ। রিক যে "Y ভাষায় X কীভাবে করবেন" এই প্রশ্নগুলির সকলের একটি বৈধ উত্তর হতে পারে :-) অবশ্যই, এই বিবৃতিতে একটি "সুবিধার্থে" অন্তর্ভুক্ত রয়েছে।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

6
চমত্কার সংক্ষিপ্তসার। চেষ্টা করার জন্য ধন্যবাদ. আমি তবে এই প্রস্তাবের সাথে একমত নই। এটি বহনযোগ্য ও বনাম আরও শক্তিশালী বাক্য গঠন port আপনি যদি আপনার পরিবেশে bash> 4 এর প্রয়োজন করতে পারেন তবে [[]] বাক্য গঠনটি সুপারিশ করা হয়।
বার্নার্ড

@ ডাউনভোটার্স দয়া করে ব্যাখ্যা করুন যাতে আমি তথ্য শিখতে ও উন্নত করতে পারি :-)
সিওরো সান্তিলি 法轮功 冠状 病 六四 事件 法轮功

8
দুর্দান্ত উত্তর তবে আমি মনে করি প্রস্তাবটি : সর্বদা ব্যবহারটি []আমার পছন্দ হিসাবে পড়া উচিত : []আপনি বহনযোগ্যতা হারাতে না চাইলে ব্যবহার করুনএখানে যেমন বলা হয়েছে : পসিক্স বা বোর্নশেলের কাছে পোর্টেবিলিটি / কনফারেন্সেশন যদি উদ্বেগজনক হয় তবে পুরানো বাক্য গঠনটি ব্যবহার করা উচিত। অন্যদিকে স্ক্রিপ্টে যদি BASH, Zsh, বা KornShell প্রয়োজন হয় তবে নতুন সিনট্যাক্সটি সাধারণত আরও নমনীয় হয় তবে অগত্যা পিছনের দিকে সামঞ্জস্য হয় না। আমি [[ ab =~ ab? ]]যদি এর চেয়ে পিছিয়ে পড়া সামঞ্জস্যতা নিয়ে কোনও উদ্বেগ না পাই তবে আমি যেতে চাইprintf 'ab' | grep -Eq 'ab?'
মরিসিওরোবায়ো

14

কন্ডিশন পরীক্ষার জন্য (যেমন [...]) একক বন্ধনীগুলির অভ্যন্তরে, কিছু অপারেটর যেমন একক =সমস্ত শেল দ্বারা সমর্থিত হয়, তবে অপারেটরের ব্যবহার ==পুরানো শেলগুলির কয়েকটি দ্বারা সমর্থন করে না।

শর্ত পরীক্ষার জন্য ডাবল বন্ধনীগুলির মধ্যে (যেমন [[...]]), পুরানো বা নতুন শেল ব্যবহারের মধ্যে =বা কোনও পার্থক্য নেই ==

সম্পাদনা: আমার এও লক্ষ্য করা উচিত: ব্যাশে, সর্বদা সম্ভব হলে ডাবল বন্ধনী ব্যবহার করুন [[...]] যদি এটি একক বন্ধনী থেকে নিরাপদ। আমি নীচের উদাহরণ সহ কেন ব্যাখ্যা করব:

if [ $var == "hello" ]; then

যদি $ var শূন্য / ফাঁকা হয়ে যায়, তবে স্ক্রিপ্টটি এটি দেখে:

if [ == "hello" ]; then

যা আপনার স্ক্রিপ্ট ভঙ্গ করবে। সমাধানটি হ'ল হয় ডাবল বন্ধনী ব্যবহার করা, বা সর্বদা আপনার ভেরিয়েবলগুলির চারপাশে উদ্ধৃতি ( "$var") লিখতে ভুলবেন না । ডাবল বন্ধনী আরও ভাল প্রতিরক্ষামূলক কোডিং অনুশীলন।


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

12

[[[কমান্ডের অনুরূপ (তবে আরও শক্তিশালী) বাশ কীওয়ার্ড ।

দেখা

http://mywiki.wooledge.org/BashFAQ/031 এবং http://mywiki.wooledge.org/BashGuide/ পরীক্ষা পরীক্ষা এবং শর্তাদি

আপনি পসিক্স শ এর জন্য লিখছেন না হলে আমরা সুপারিশ করি [[


1

হালকা রেজেক্স ম্যাচের জন্য আপনি ডাবল বর্গাকার বন্ধনী ব্যবহার করতে পারেন, যেমন:

if [[ $1 =~ "foo.*bar" ]] ; then

(যতক্ষণ আপনি ব্যাশের সংস্করণ ব্যবহার করছেন ততক্ষণ এই বাক্য গঠনটি সমর্থন করে)


6
আপনি প্যাটার্নটি উদ্ধৃত করেছেন ব্যতীত এখন এটি আক্ষরিক স্ট্রিং হিসাবে বিবেচিত হবে।
ormaaj

খুবই সত্য. কখনও কখনও এটি আমাকে বিরক্ত করে :)
asf107

1

বাশ ম্যানুয়াল বলেছেন:

[[, '<' এবং '>' অপারেটরগুলি ব্যবহার করে বর্তমান লোকেল ব্যবহার করে শব্দকোষ অনুসারে বাছাই করুন। পরীক্ষা কমান্ডটি ASCII ক্রম ব্যবহার করে।

(পরীক্ষার কমান্ডটি [] এর অনুরূপ)

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