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


আমি শুধু ঠিক মধ্যে পার্থক্য কি বিস্মিত

[[ $STRING != foo ]]

এবং

[ $STRING != foo ]

হয়, পাশাপাশি পরের posix-compliant হয়, শ পাওয়া যায় এবং প্রাক্তন bash পাওয়া একটি এক্সটেনশান।


347
2017-08-09 21:11


উত্স


যদি আপনি কোন বন্ধনী ব্যবহার সম্পর্কে অবাক হয়েছিলেন, যেমন। একটি প্রেক্ষাপটে if বিবৃতি, দেখুন mywiki.wooledge.org/BashPitfalls#if_.5Bgrep_foo_myfile.5D - Kev
উবুন্টুর ডক্স থেকেও: wiki.ubuntu.com/... - radistao


উত্তর:


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

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

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

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

262
2017-08-09 21:56



ধন্যবাদ, ব্যাশ FAQ- এর লিঙ্কটি আমি যা খুঁজছি তা ছিল (যে পৃষ্ঠার সম্পর্কে জানতাম না, ধন্যবাদ)। - 0x89
আমি এই তথ্য দিয়ে আপনার পোস্ট সম্পাদনা করেছি, কিন্তু [এবং পরীক্ষা নির্মিত হিসাবে নির্বাহ করা হয়। বিল্টিনগুলি / bin / [এবং / bin / test প্রতিস্থাপনের জন্য ডিজাইন করা হয়েছে তবে বাইনারিগুলির সীমাবদ্ধতাগুলি পুনরুত্পাদন করার জন্যও প্রয়োজন। কমান্ড 'টাইপ [' বিল্টিন ব্যবহার করা হয় তা যাচাই করে। 'যা [শুধুমাত্র PATH এ এক্সিকিউটেবল অনুসন্ধান করে এবং' টাইপ-পি [' - klynch


সংক্ষেপে:

[একটি ব্যাশ Builtin

[[]] bash হয় কীওয়ার্ড

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

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

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

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


110
2017-12-29 19:42



[ একটি POSIX শেল কমান্ড; এটা নির্মিত করা প্রয়োজন। ] শুধুমাত্র একটি যুক্তি যা কমান্ডের জন্য সন্ধান করে, যাতে সিনট্যাক্স সুষম হয়। কমান্ডের জন্য একটি প্রতিশব্দ test সেটি বাদে test একটি বন্ধ জন্য চেহারা না ]। - Kaz
এখানে দেখো: pubs.opengroup.org/onlinepubs/009695399/utilities/test.html - Kaz


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

4.3.11 সংস্করণে পরীক্ষা করা হয়েছে:

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

    • [  POSIX হয়
    • [[ একটি বাশ এক্সটেনশন
  • নিয়মিত কমান্ড বনাম জাদু

    • [ একটি অদ্ভুত নাম সঙ্গে একটি নিয়মিত কমান্ড।

      ] শুধু একটি যুক্তি [ যে ব্যবহার করা থেকে আরও আর্গুমেন্ট বাধা দেয়।

      উবুন্টু 16.04 এ আসলে এটির জন্য একটি এক্সিকিউটেবল আছে /usr/bin/[ কোর্টিলিল দ্বারা সরবরাহিত, কিন্তু অন্তর্নির্মিত সংস্করণ অগ্রাধিকার লাগে।

      বাশের আদেশে পার্থক্য কিছুতেই পরিবর্তিত হয় না।

      নির্দিষ্টভাবে, < পুনঃনির্দেশনা, && এবং || একাধিক কমান্ড concatenate, ( ) দ্বারা escaped না হওয়া পর্যন্ত subshells জেনারেট করে \, এবং শব্দ বিস্তার স্বাভাবিক হিসাবে ঘটবে।

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

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

    Bashese মধ্যে: [ একটি অন্তর্নির্মিত কমান্ড, এবং [[ একটি শব্দ https://askubuntu.com/questions/445749/whats-the-difference-between-shell-builtin-and-shell-keyword

  • <

    • [[ a < b ]]: লেক্সিকোগ্রাফিক তুলনা
    • [ a \< b ]: উপরের মতই. \ প্রয়োজনীয় বা অন্য কোন কমান্ডের জন্য মত পুনঃনির্দেশনা না। বাশ এক্সটেনশন।
    • আমি এই একটি POSIX বিকল্প খুঁজে পাচ্ছি না, দেখুন: https://stackoverflow.com/questions/21294867/how-to-test-strings-for-less-than-or-equal
  • && এবং ||

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

    • [[ (a = a || a = b) && a = b ]]মিথ্যা
    • [ ( a = a ) ]: বাক্যগঠন ত্রুটি, () একটি subshell হিসাবে ব্যাখ্যা করা হয়
    • [ \( a = a -o a = b \) -a a = b ]সমতুল্য, কিন্তু () POSIX দ্বারা অপ্রাপ্তিত হয়
    • ([ a = a ] || [ a = b ]) && [ a = b ] POSIX সুপারিশ
  • শব্দ বিভাজন

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

    • [[ ab = a? ]]: সত্য, কারণ এটা করে প্যাটার্ন ম্যাচিং (* ? [ জাদু আছে)। Glob বর্তমান ডিরেক্টরির মধ্যে ফাইল প্রসারিত না।
    • [ ab = a? ]: a? গ্লোব প্রসারিত। বর্তমান ডিরেক্টরির মধ্যে ফাইলের উপর নির্ভর করে তাই সত্য বা মিথ্যা হতে পারে।
    • [ ab = a\? ]: মিথ্যা, গ্লব বিস্তার না
    • = এবং == উভয় একই [ এবং [[, কিন্তু == একটি বাশ এক্সটেনশন।
    • printf 'ab' | grep -Eq 'a.': POSIX ERE সমতুল্য
    • [[ ab =~ 'ab?' ]]: মিথ্যা, সঙ্গে জাদু হারান ''
    • [[ ab? =~ 'ab?' ]]সত্য
  • =~

সুপারিশ

আমি সবসময় ব্যবহার করতে পছন্দ করি []

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

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

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

63
2017-07-12 10:22



ব্যবহারবিধি printf 'ab' | grep -Eq 'ab?' মধ্যে if [ … ]? - meeDamian
@meeDamian if ( printf 'ab' | grep -Eq 'a' ); then echo 'a'; fi। [] ঠিক মত একটি কমান্ড grep। দ্য () যে কমান্ড প্রয়োজন হতে পারে না আমি নিশ্চিত নই: কারণ আমি এটা যুক্ত |, কিভাবে Bash প্যাসেস জিনিস উপর নির্ভর করে। যদি সেখানে ছিল না | আমি নিশ্চিত আপনি লিখতে পারেন if cmd arg arg; then। - Ciro Santilli 新疆改造中心 六四事件 法轮功
@ এমডামিয়ান হ্যাঁ, কোন প্রয়োজন নেই () এটা দেখতে: stackoverflow.com/questions/8965509/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
চমৎকার তালিকা! আরো দেখুন: wiki.ubuntu.com/... - radistao


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


4
2017-08-09 21:17





একক বন্ধনী অর্থাত [] POSIX শেল একটি শর্তাধীন অভিব্যক্তি ঘিরে সম্মতি।

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

Bash ইন, সাংখ্যিক তুলনা জন্য আমরা ব্যবহার 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

3
2018-02-08 03:15