বাশ অপারেটরদের মধ্যে [[বনাম [বনাম (বনাম) ((?


243

ব্যাশ (বন্ধনী, ডাবল বন্ধনী, প্রথম বন্ধনী এবং ডাবল বন্ধনী) ব্যবহার করার সময় এই অপারেটরগুলি আলাদাভাবে কী করে সে সম্পর্কে আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি।

[[ , [ , ( , ((

আমি লোকেরা এগুলিকে ব্যবহার করতে দেখেছি যদি এরকম বিবৃতি থাকে:

if [[condition]]

if [condition]

if ((condition))

if (condition)



3
@ কুওগলম ইওরোনিক কারণ এই লিঙ্কটি প্রথম ফলাফল হিসাবে এই প্রশ্নটি দেয়। প্যারাডক্স!
উন্মাদ

5
আমি মনে করি ডকুমেন্টেশন পড়া কোনও বিকল্প নয়?
হালকা ঘোড়দৌড়

34
প্রবন্ধাদি এবং বন্ধনীগুলি ডকুমেন্টেশনে অনুসন্ধান করা এত সহজ নয় এবং যদি আপনি এই বৈশিষ্ট্যগুলির নাম না জানেন তবে আপনার কাছে এটিই ছিল।
ইলক্কাচু

উত্তর:


255

একটি ifবিবৃতি সাধারণত দেখতে লাগে

if commands1
then
   commands2
else
   commands3
fi

thenযদি করে প্রস্থান কোড দফা কার্যকর commands1শূন্য। যদি প্রস্থান কোডটি ননজারো হয় তবে ক্লজটি elseকার্যকর করা হয়। commands1সহজ বা জটিল হতে পারে। এটা তোলে, উদাহরণস্বরূপ, এক বা একাধিক পাইপলাইনগুলি অপারেটরদের এক দ্বারা পৃথক একটি ক্রম হতে পারে ;, &, &&, অথবা ||ifনিচে দেখানো অবস্থার শুধু বিশেষ মামলা আছে commands1:

  1. if [ condition ]

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

  2. if [[ condition ]]

    এই একটি নতুন আপগ্রেড তারতম্য আছে testথেকে ksh যে bash এবং zsh এছাড়াও সমর্থন করি। এই testকমান্ডটি একটি প্রস্থান কোডও সেট করে এবং ifস্টেটমেন্ট সেই অনুযায়ী কাজ করে। এর বর্ধিত বৈশিষ্ট্যগুলির মধ্যে এটি পরীক্ষা করতে পারে যে কোনও স্ট্রিং একটি নিয়মিত অভিব্যক্তির সাথে মেলে কিনা।

  3. if ((condition))

    ব্যাশ এবং zsh এছাড়াও সমর্থন করে এমন আরেকটি ksh এক্সটেনশন । এটি পাটিগণিত সম্পাদন করে। পাটিগণিতের ফলাফল হিসাবে, একটি প্রস্থান কোড সেট করা হয় এবং বিবৃতি অনুসারে কাজ করে। পাটিগণিত গণনার ফলাফল যদি না হয় তবে এটি শূন্যের একটি প্রস্থান কোড (সত্য) প্রদান করে। পছন্দ করুন , এই ফর্মটি পসিক্স নয় এবং অতএব পোর্টেবল নয়।if[[...]]

  4. if (command)

    এটি একটি সাব-শেলের কমান্ড চালায়। কমান্ডটি সমাপ্ত হলে এটি একটি প্রস্থান কোড নির্ধারণ করে এবং ifবিবৃতি অনুসারে কাজ করে।

    এই মত একটি subshell ব্যবহার করার জন্য একটি আদর্শ কারণ পার্শ্ব প্রতিক্রিয়া সীমিত করতে হয় commandযদি commandপরিবর্তনশীল বরাদ্দকরণ বা শেল এর পরিবেশ অন্যান্য পরিবর্তন প্রয়োজন। সাবস্কেল সমাপ্ত হওয়ার পরে এ জাতীয় পরিবর্তনগুলি থেকে যায় না।

  5. if command

    কমান্ড কার্যকর করা হয় এবং ifবিবৃতিটি তার প্রস্থান কোড অনুসারে কাজ করে।


24
5 তম বিকল্প অন্তর্ভুক্ত করার জন্য ধন্যবাদ। এটি আসলে কীভাবে কাজ করে এবং আশ্চর্যরূপে কার্যকর হয় না তা বোঝার মূল চাবিকাঠি।
ছানা

4
নোট করুন যে [আসলে একটি বাইনারি, কোনও অভ্যন্তরীণ কমান্ড বা প্রতীক নয়। সাধারণত থাকে /bin
জুলিয়ান আর।

8
@JulienR। আসলে [যেমন একটি বিল্ট ইন test। সামঞ্জস্যতার কারণে বাইনারি সংস্করণ উপলব্ধ। চেক আউট help [এবং help test
ওল্ডটাইমার

4
তিনি লক্ষ করেন, যখন ((POSIX নয, যার মূল্য $((। অর্থাত গাণিতিক সম্প্রসারণ এবং এটি তাদের গুলান করা খুবই সহজ প্রায়শই একটি ওয়ার্কঅ্যারাউন্ড কিছু ব্যবহার করতে ভালো হয় [ $((2+2)) -eq 4 ]শর্তসাপেক্ষ বিবৃতির গাণিতিক ব্যবহার করতে
Sergiy Kolodyazhnyy

মজা নতুন লাইন মুদ্রণ আছে কিভাবে: if echo; then echo; fi
অ্যান্থনিডি 973

77
  • (…)বন্ধনী একটি সাব-শেল নির্দেশ করে । এগুলির ভিতরে থাকা অন্যান্য ভাষার মতো একটি অভিব্যক্তি নয়। এটি আদেশের তালিকা (ঠিক বাইরের বন্ধনীগুলির মতো)। এই কমান্ডগুলি পৃথক সাবপ্রসেসে কার্যকর করা হয়, সুতরাং প্রথম বন্ধনীর ভিতরে সম্পাদিত কোনও পুনর্নির্দেশ, কার্যাদি ইত্যাদি প্যারেন্টেসিসের বাইরে কোনও প্রভাব ফেলে না।
    • একটি নেতৃস্থানীয় ডলার চিহ্ন দিয়ে, $(…)একটি হল কমান্ড প্রতিকল্পন আছে: প্রথম বন্ধনী ভিতরে কমান্ড, এবং কমান্ডের ফলাফল কমান্ড লাইন অংশ হিসাবে ব্যবহার করা হয় (অতিরিক্ত প্রসারণও যদি না প্রতিকল্পন উদ্ধৃতি চিহ্ন মধ্যে পরে কিন্তু যে অন্য গল্প ) ।
  • { … }ধনুর্বন্ধনী হ'ল প্রথম বন্ধনীগুলির মতো যা তারা কমান্ডগুলি গোষ্ঠীভুক্ত করে তবে তারা কেবল পার্সিংকে প্রভাবিত করে, গোষ্ঠীকরণ নয়। প্রোগ্রামটি x=2; { x=4; }; echo $x4 টি মুদ্রণ করে যেখানে x=2; (x=4); echo $x2 টি মুদ্রণ করে (2 এছাড়াও বন্ধনীরূপগুলি হ'ল ব্রেসেসগুলি কমান্ড পজিশনে সীমাবদ্ধ করা এবং কমান্ড পজিশনে পাওয়া দরকার (সুতরাং স্থানটি পরে {এবং তার ;আগে }) যেখানে বন্ধনীগুলি নেই That's এটি কেবল একটি বাক্য গঠন) qu
    • শীর্ষস্থানীয় ডলারের চিহ্ন সহ, সম্ভাব্য অতিরিক্ত ট্রান্সফর্মেশন সহ একটি ভেরিয়েবলের মান পর্যন্ত প্রসারিত, ${VAR}একটি প্যারামিটারের সম্প্রসারণksh93শেল এছাড়াও সমর্থন ${ cmd;}কমান্ড প্রতিকল্পন করে একটি subshell ডিম নেই আকারে হিসাবে।
  • ((…))দ্বৈত বন্ধনীগুলি একটি গাণিতিক নির্দেশকে ঘিরে , যা অন্যান্য প্রোগ্রামিং ভাষার সাথে সংশ্লেষ সহ একটি পূর্ণসংখ্যার উপর একটি গণনা comp এই বাক্য গঠনটি বেশিরভাগ ক্ষেত্রে অ্যাসাইনমেন্ট এবং শর্তসাপেক্ষে ব্যবহৃত হয়। এটি কেবল ksh / bash / zsh এ বিদ্যমান, প্লেন sh এ নয়।
    • পাটিগণিতের এক্সপ্রেশনগুলিতে একই বাক্য গঠন ব্যবহার করা হয় $((…))যা অভিব্যক্তির পূর্ণসংখ্যার মান পর্যন্ত প্রসারিত হয়।
  • [ … ]একক বন্ধনী শর্তসাপেক্ষ প্রকাশের চারপাশে । শর্তসাপেক্ষ এক্সপ্রেশনগুলি বেশিরভাগ অপারেটরগুলিতে তৈরি হয় যেমন -n "$variable"ভেরিয়েবলটি খালি -e "$file"রয়েছে কিনা তা পরীক্ষা করা এবং কোনও ফাইল উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে। মনে রাখবেন যে প্রতিটি অপারেটরের চারপাশে আপনার একটি স্থান প্রয়োজন (যেমন [ "$x" = "$y" ], না [ "$x"="$y" ]) এবং ;বন্ধনীগুলির ভিতরে এবং বাইরে উভয় জায়গার মতো একটি স্থান বা একটি অক্ষর (যেমন [ -n "$foo" ], নয় [-n "$foo"])।
  • [[ … ]]ডাবল বন্ধনী কয়েকটি অতিরিক্ত বৈশিষ্ট্য সহ ksh / bash / zsh এ শর্তযুক্ত অভিব্যক্তিগুলির একটি বিকল্প রূপ, উদাহরণস্বরূপ আপনি [[ -L $file && -f $file ]]পরীক্ষা করতে লিখতে পারেন যদি কোনও ফাইল একটি নিয়মিত ফাইলের প্রতীকী লিঙ্ক হয় যেখানে একক বন্ধনী প্রয়োজন হয় [ -L "$file" ] && [ -f "$file" ]। দেখুন কোট ব্যতীত ফাঁকা জায়গাগুলির সাথে পরামিতি সম্প্রসারণ কেন ডাবল বন্ধনীগুলির [[তবে একক বন্ধনী নয়] এর ভিতরে কাজ করে? এই বিষয়ে আরও জন্য।

শেল-এ, প্রতিটি কমান্ড একটি শর্তসাপেক্ষ কমান্ড: প্রতিটি কমান্ডের একটি রিটার্নের স্থিতি থাকে যা হয় 0 বা সাফল্যের ইঙ্গিত দেয় বা 1 এবং 255 এর মধ্যে পূর্ণসংখ্যা (এবং কিছু শেলের মধ্যে সম্ভবত আরও বেশি) ব্যর্থতা নির্দেশ করে। [ … ]কমান্ড (অথবা [[ … ]]সিনট্যাক্স ফর্ম) একটি নির্দিষ্ট কমান্ড যা বানান করা যায় test …এবং সফল যখন একটি ফাইল বিদ্যমান, অথবা যখন একটি স্ট্রিং অ খালি, অথবা যখন একটি সংখ্যা অন্য চেয়ে ছোট, ইত্যাদি ((…))সিনট্যাক্স ফর্ম সফল যখন একটি সংখ্যা ননজারো শেল স্ক্রিপ্টে কন্ডিশনার কয়েকটি উদাহরণ এখানে দেওয়া হয়েছে:

  • myfileস্ট্রিং রয়েছে কিনা তা পরীক্ষা করুন hello:

    if grep -q hello myfile; then 
  • যদি mydirডিরেক্টরি হয় তবে এটিতে পরিবর্তন করুন এবং স্টাফ করুন:

    if cd mydir; then
      echo "Creating mydir/myfile"
      echo 'some content' >myfile
    else
      echo >&2 "Fatal error. This script requires mydir to exist."
    fi
  • myfileবর্তমান ডিরেক্টরিতে যদি কোনও ফাইল বলা হয় তবে পরীক্ষা করুন:

    if [ -e myfile ]; then 
  • একই, তবে প্রতীকী লিঙ্কগুলিতে ঝাঁকুনি সহ:

    if [ -e myfile ] || [ -L myfile ]; then 
  • টেস্ট যদি এর মান x(যা সাংখ্যিক গণ্য করা হয়) portably, কমপক্ষে 2 হল:

    if [ "$x" -ge 2 ]; then 
  • টেস্ট যদি এর মান x(যা সাংখ্যিক গণ্য করা হয়) ব্যাশ এ, কমপক্ষে 2 হয় / ksh / zsh:

    if ((x >= 2)); then 

নোট করুন যে একক বন্ধনী -aপরিবর্তে সমর্থন করে &&, সুতরাং যে কেউ লিখতে পারেন: [ -L $file -a -f $file ]যা বন্ধনীর মধ্যে অতিরিক্ত [এবং অতিরিক্ত ছাড়াই একই সংখ্যার অক্ষর ]...
অ্যালেক্সিস উইলক

6
@ অ্যালেক্সিসউইলক অপারেটরগুলি -aএবং -oসমস্যাযুক্ত কারণ এতে জড়িত কিছু অপারেটর অপারেটরগুলির মতো দেখায় তারা ভুল পার্স করতে পারে। এজন্য আমি তাদের উল্লেখ করি না: তাদের শূন্য সুবিধা রয়েছে এবং সবসময় কাজ করে না। এবং কোনও ভাল কারণ ব্যতীত অব্যক্ত ভেরিয়েবল বিস্তৃতি কখনই লিখবেন না: [[ -L $file -a -f $file ]]ঠিক আছে তবে আপনার প্রয়োজন একক বন্ধনী [ -L "$file" -a -f "$file" ](যা ঠিক আছে, যদি $fileসর্বদা শুরু হয় /বা শুরু হয় ./)।
গিলস

মনে রাখবেন এটি [[ -L $file && -f $file ]]( বৈকল্পিকের -aসাথে নেই [[...]])।
স্টাফেন চেজেলাস

18

থেকে ব্যাশ ডকুমেন্টেশন :

(list)তালিকাটি একটি সাব-শেল পরিবেশে কার্যকর করা হয় (নীচে কম্যান্ড এক্সিকিউশন এনভায়রনমেন্ট দেখুন)। পরিবর্তনশীল অ্যাসাইনমেন্ট এবং বিল্টিন কমান্ডগুলি যা শেলের পরিবেশকে প্রভাবিত করে কমান্ডটি শেষ হওয়ার পরে কার্যকর হয় না। রিটার্নের স্থিতি হল তালিকার প্রস্থান স্থিতি।

অন্য কথায়, আপনি কি নিশ্চিত যে যাই হোক না কেন (ক মত 'তালিকা' ঘটে করতে cd) বাইরে কোনো প্রভাব নেই (এবং )। শুধু ফুটা করা হবে গত কমান্ডের বা প্রস্থান কোড set -eপ্রথম কমান্ড যে (ক যেমন কয়েক ছাড়া অন্য একটি ত্রুটি উত্পন্ন if, whileইত্যাদি)

((expression))অভিব্যক্তি মূল্যায়ন মূল্যায়নের অধীনে বর্ণিত নিয়ম অনুসারে মূল্যায়ন করা হয়। যদি অভিব্যক্তির মান শূন্য-না হয়, ফেরতের স্থিতি 0 হয়; অন্যথায় রিটার্নের স্থিতি ১। এটি "এক্সপ্রেশন" হিসাবে ঠিক সমান।

এটি বাশ এক্সটেনশন যা আপনাকে গণিত করতে দেয়। এটি কিছু exprসীমাবদ্ধতা ছাড়াই ব্যবহার করার মতো expr(যেমন সর্বত্র স্থান থাকা, পালানো *ইত্যাদি),

[[ expression ]]শর্তাধীন অভিব্যক্তি প্রকাশের মূল্যায়নের উপর নির্ভর করে 0 বা 1 এর একটি স্থিতি ফেরত দিন। শর্তাবলী নীচে বর্ণিত প্রাথমিকগুলি সমন্বিত হয় শর্তসাপেক্ষী এক্সপ্রেসনস এর আওতায়। [[এবং]] এর মধ্যে শব্দের উপর শব্দ বিভাজন এবং পথের নাম সম্প্রসারণ করা হয় না; টিলডে এক্সপেনশন, প্যারামিটার এবং ভেরিয়েবল এক্সপেনশন, পাটিগণিতের সম্প্রসারণ, কমান্ড প্রতিস্থাপন, প্রক্রিয়া প্রতিস্থাপন এবং উদ্ধৃতি অপসারণ সম্পাদন করা হয় performed শর্তসাপেক্ষ অপারেটর যেমন -f অবশ্যই প্রাথমিক হিসাবে স্বীকৃত হতে হবে

[[, <এবং> অপারেটরগুলি বর্তমান লোকেল ব্যবহার করে অভিধানিকভাবে সাজান।

স্ট্রিং, সংখ্যা এবং ফাইলগুলিকে testঅফারের মতো কিছুটা তুলনা করার জন্য এটি একটি উন্নত পরীক্ষার প্রস্তাব দেয় তবে আরও শক্তিশালী।

[ expr ]শর্তসাপেক্ষ এক্সপ্রেশন এক্সপের মূল্যায়নের উপর নির্ভর করে 0 (সত্য) বা 1 (মিথ্যা) এর একটি স্থিতি ফেরত দিন। প্রতিটি অপারেটর এবং অপার এবং অবশ্যই পৃথক যুক্তি হতে হবে। শর্তাবলী এক্সপ্রেসনস এর অধীনে উপরে বর্ণিত প্রাথমিকগুলি নিয়ে গঠিত। পরীক্ষা কোনও বিকল্প গ্রহণ করে না, বা এটি কোনও যুক্তিও গ্রহণ করে এবং উপেক্ষা করে না - বিকল্পগুলির শেষের চিহ্ন হিসাবে।

[...]

এই এক কল test। আসলে, পুরানো দিনগুলিতে [এটি একটি প্রতীকী লিঙ্ক ছিল test। এটি একইভাবে কাজ করে এবং আপনার একই সীমাবদ্ধতা রয়েছে। যেহেতু কোনও বাইনারি নামটি শুরু করে তা জেনেছিল তাই পরীক্ষার প্রোগ্রামটি কোনও পরামিতি না পাওয়া পর্যন্ত প্যারামিটারগুলি পার্স করতে পারে ]। মজা ইউনিক্স কৌশল।

মনে রাখবেন যে, ক্ষেত্রে bash, [এবং testবিল্ট-ইন ফাংশান (একটি মন্তব্যে উল্লেখ হিসাবে) হয়, এখনো কাছাকাছি একই সীমাবদ্ধতা প্রযোজ্য হবে।


1
যদিও testএবং [অবশ্যই বাশে অন্তর্নির্মিত কমান্ডগুলি রয়েছে তবে এটি সম্ভবত বাহ্যিক বাইনারি উপস্থিত রয়েছে।
ইলক্কাচু

1
এর জন্য বাহ্যিক বাইনারি বেশিরভাগ আধুনিক সিস্টেমে [প্রতীকী লিঙ্ক নয় test
র্যান্ডম 832

1
একরকম, আমি এটি মজাদার মনে করি যে তারা দুটি পৃথক বাইনারি তৈরি করতে বিরক্ত করে, যা উভয়ই কেবল তাদের সংমিশ্রণ এবং বেশ কয়েকটি শর্তসাপেক্ষ যুক্ত করার পরিবর্তে তাদের যা প্রয়োজন ঠিক তা-ও করে। যদিও strings /usr/bin/testএটি আসলে দেখায় এটির সাহায্যের পাঠ্যও রয়েছে, তাই আমি কী বলব তা জানি না।
ইলক্কাচু

2
@ র্যান্ডম 832 অপ্রত্যাশিত আরগ0 আচরণ এড়াতে জিএনইউ যুক্তি সম্পর্কে আপনার বক্তব্যটি পেয়েছি তবে পসিক্স প্রয়োজনীয়তা সম্পর্কে, আমি এতটা সত্যবাদী হব না। যদিও testকমান্ডটি অবশ্যই স্ট্যান্ডার্ড একক ফাইল ভিত্তিক কমান্ড হিসাবে স্ট্যান্ডার্ড দ্বারা উপস্থিত থাকা প্রয়োজন, এটিতে কিছুই বলে না যে এর [রূপটিও সেভাবে প্রয়োগ করা দরকার। উদাহরণস্বরূপ, সোলারিস 11 কোনও [এক্সিকিউটেবল সরবরাহ করে না তবে তবুও
পসিক্স

2
(প্রস্থান 1) এর প্রথম বন্ধনের বাইরে একটি প্রভাব রয়েছে।
আলেকজান্ডার

14

[ বনাম [[

এই উত্তরটি প্রশ্নের [বনাম [[উপসেটটি কভার করবে ।

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 ]সমতুল্য হবে।


তথ্যের জন্য @ স্টাফেনচেজেলাস ধন্যবাদ! আমি exprউত্তর যুক্ত করেছি । "ব্যাশ এক্সটেনশান" শব্দটি বোঝানোর অর্থ এই নয় যে বাশ কিছু সিনট্যাক্স যুক্ত করার প্রথম শেল ছিল, পসিক্স বনাম বাশ শিখতে ইতিমধ্যে আমাকে পাগল করার জন্য যথেষ্ট।
সিরো সান্তিলি 事件 改造 中心 法轮功 六四 事件

man testআপনি চেষ্টা করে man [হারিয়েছেন কিনা দেখুন । এটি পসিক্স বৈকল্পিকটি ব্যাখ্যা করবে।
জোনাথন কোমার

13

কিছু উদাহরণ:

Ditionতিহ্যবাহী পরীক্ষা:

foo="some thing"
# check if value of foo is not empty
if [ -n "$foo" ] ; then... 
if test -n "$foo" ; then... 

testএবং [কমান্ডগুলি অন্যের মতো, সুতরাং ভেরিয়েবলটি শব্দের মধ্যে বিভক্ত হয় যদি না তা উদ্ধৃতি হয়।

নতুন স্টাইল পরীক্ষা

[[ ... ]] এটি একটি (নতুন) বিশেষ শেল কনস্ট্রাক্ট, যা কিছুটা আলাদাভাবে কাজ করে, সবচেয়ে স্পষ্ট বিষয় হ'ল এটি শব্দ-বিভাজন ভেরিয়েবলগুলি নয়:

if [[ -n $foo ]] ; then... 

এখানে এবং এখানে কিছু ডকুমেন্টেশন[[[

পাটিগণিত পরীক্ষা:

foo=12 bar=3
if (( $foo + $bar == 15 )) ; then ...  

"সাধারণ" আদেশগুলি:

উপরের সমস্তগুলি সাধারণ কমান্ডের মতো কাজ করে এবং ifযে কোনও আদেশ নিতে পারে:

# grep returns true if it finds something
if grep pattern file ; then ...

একাধিক আদেশ:

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

# this will move to $somedir only for the duration of the subshell 
if ( cd $somedir ; some_test ) ; then ...

# while here, the rest of the script will see the new working
# directory, even after the test
if cd $somedir ; some_test ; then ...

1

গ্রুপিং কমান্ড

ইউনিট হিসাবে কার্যকর করার জন্য কমান্ডের তালিকার গ্রুপ করার জন্য বাশ দুটি উপায় সরবরাহ করে।

( list )বন্ধনীগুলির মধ্যে কমান্ডের একটি তালিকা স্থাপনের ফলে একটি সাব-শেল পরিবেশ তৈরি হবে এবং তালিকার প্রতিটি কমান্ড সেই সাবশেলে সম্পাদিত হবে। যেহেতু তালিকাটি সাব-শেলের মধ্যে কার্যকর করা হয়েছে, ভেরিয়েবল অ্যাসাইনমেন্টগুলি সাব-শেল সম্পূর্ণ হওয়ার পরে কার্যকর হয় না।

$ a=1; (a=2; echo "inside: a=$a"); echo "outside: a=$a"
inside: a=2
outside: a=1

{ list; }কোঁকড়া ধনুর্বন্ধনীগুলির মধ্যে কমান্ডের একটি তালিকা স্থাপনের ফলে তালিকার বর্তমান শেল প্রসঙ্গে কার্যকর করা যায় । কোনও সাবশেল তৈরি হয় না। সেমিকোলন (বা নিউলাইন) নিম্নলিখিত তালিকাটি প্রয়োজনীয়। উৎস

${} Parameter expansion Ex:  ANIMAL=duck; echo One $ANIMAL, two ${ANIMAL}s
$() Command substitution Ex: result=$(COMMAND) 
$(()) Arithmetic expansion Ex: var=$(( 20 + 5 )) 

শর্তাধীন কনস্ট্রাক্টস

একক বন্ধনী অর্থাত্ []
তুলনা করার জন্য ==, !=, <,এবং >এবং ব্যবহার করা উচিত এবং সংখ্যার তুলনার জন্য eq, ne,ltএবং gtব্যবহার করা উচিত।

বর্ধিত বন্ধনী অর্থাত্‍[[]]

উপরের সমস্ত উদাহরণগুলিতে, আমরা শর্তসাপেক্ষ প্রকাশটি বন্ধ করতে কেবলমাত্র একক বন্ধনী ব্যবহার করেছি, তবে ব্যাশ ডাবল বন্ধনীগুলিকে মঞ্জুরি দেয় যা একক-বন্ধনী সিনট্যাক্সের বর্ধিত সংস্করণ হিসাবে কাজ করে।

তুলনার জন্য ==, !=, <,এবং >আক্ষরিক ব্যবহার করতে পারেন।

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

উৎস

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