ডাবল বা একক বন্ধনী, বন্ধনী, কোঁকড়া ধনুর্বন্ধনী কীভাবে ব্যবহার করবেন


657

আমি বন্ধনে আবদ্ধ, বন্ধনী, বাশে কোঁকড়ানো ধনুর্বন্ধনী ব্যবহারের পাশাপাশি তাদের দ্বৈত বা একক ফর্মের মধ্যে পার্থক্য দেখে বিভ্রান্ত হয়েছি। এর কোন স্পষ্ট ব্যাখ্যা আছে?

উত্তর:


605

বাশে, testএবং [শেল বিল্টিনস।

ডবল বন্ধনী , যা একটি শেল শব্দ হয়, অতিরিক্ত কার্যকারিতা দেয়। উদাহরণস্বরূপ, যদি আপনি ব্যবহার করতে পারেন &&এবং ||পরিবর্তে -aএবং -oসেখানে একটি রেগুলার এক্সপ্রেশন ম্যাচিং অপারেটর এর =~

এছাড়াও, একটি সাধারণ পরীক্ষায়, ডাবল বর্গাকার বন্ধনীগুলি একক একের চেয়ে অনেক দ্রুত মূল্যায়ন করে বলে মনে হয়।

$ time for ((i=0; i<10000000; i++)); do [[ "$i" = 1000 ]]; done

real    0m24.548s
user    0m24.337s
sys 0m0.036s
$ time for ((i=0; i<10000000; i++)); do [ "$i" = 1000 ]; done

real    0m33.478s
user    0m33.478s
sys 0m0.000s

ব্রেসগুলি একটি পরিবর্তনশীল নাম সীমিত করার সাথে সাথে প্যারামিটার বিস্তারের জন্য ব্যবহৃত হয় যাতে আপনি এই জাতীয় জিনিসগুলি করতে পারেন:

  • একটি ভেরিয়েবলের বিষয়বস্তুগুলি কেটে দিন

    $ var="abcde"; echo ${var%d*}
    abc
    
  • এর মতো বিকল্পগুলি তৈরি করুন sed

    $ var="abcde"; echo ${var/de/12}
    abc12
    
  • একটি ডিফল্ট মান ব্যবহার করুন

    $ default="hello"; unset var; echo ${var:-$default}
    hello
    
  • এবং আরও বেশ কিছু

এছাড়াও, বন্ধনী বিস্তৃতি স্ট্রিংগুলির তালিকা তৈরি করে যা সাধারণত লুপগুলিতে পুনরাবৃত্তি হয়:

$ echo f{oo,ee,a}d
food feed fad

$ mv error.log{,.OLD}
(error.log is renamed to error.log.OLD because the brace expression
expands to "mv error.log error.log.OLD")

$ for num in {000..2}; do echo "$num"; done
000
001
002

$ echo {00..8..2}
00 02 04 06 08

$ echo {D..T..4}
D H L P T

নোট করুন যে বাশ 4 এর আগে নেতৃস্থানীয় শূন্য এবং বর্ধিত বৈশিষ্ট্যগুলি উপলভ্য ছিল না।

ব্রেস বিস্তৃতি সম্পর্কে আমাকে স্মরণ করিয়ে দেওয়ার জন্য জিবিফফিকে ধন্যবাদ।

গাণিতিক ক্রিয়াকলাপগুলির জন্য ডাবল বন্ধনী ব্যবহৃত হয় :

((a++))

((meaning = 42))

for ((i=0; i<10; i++))

echo $((a + b + (14 * c)))

এবং তারা আপনাকে পূর্ণসংখ্যার এবং অ্যারে ভেরিয়েবলগুলিতে ডলার চিহ্নগুলি বাদ দিতে সক্ষম করে এবং পড়ার যোগ্যতার জন্য অপারেটরগুলির চারপাশে ফাঁকা স্থান অন্তর্ভুক্ত করে।

একক বন্ধনী অ্যারে সূচকগুলির জন্যও ব্যবহৃত হয় :

array[4]="hello"

element=${array[index]}

ডান হাতের দিকে (সর্বাধিক / সমস্ত?) অ্যারে রেফারেন্সগুলির জন্য কোঁকড়া ধনুর্বন্ধনী প্রয়োজন।

মহামান্য মন্তব্যটি আমাকে মনে করিয়ে দিয়েছিল যে বন্ধনীগুলিও সাব-শেলের জন্য ব্যবহৃত হয়। এবং তারা অ্যারে তৈরি করতে ব্যবহৃত হয়।

array=(1 2 3)
echo ${array[1]}
2

8
সতর্কতা: এই ফাংশনটি কাঁটাচামচ বোমা, এটি চালাবেন না। দেখুন: en.wikedia.org/wiki/Fork_bomb
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত

3
এটি কেবলমাত্র একটি কাঁটাচামচ বোমা যদি আপনি অতিরিক্ত দিয়ে আবেদন করেন :
ephemient

7
এছাড়াও সম্পূর্ণতার জন্য, আমি শুধু এই জুড়ে একটি পুরানো লিপিতে প্রকাশিত হল, $[expression]; এটি নতুন, পছন্দসই সিনট্যাক্সের জন্য পুরানো, অবচিত গণিত এক্সপ্রেশন সিনট্যাক্স:$((expression))
মাইকেল

2
কোঁকড়া ধনুর্বন্ধনী আর একটি ব্যবহার @DennisWilliamson মধ্যে bashসিকোয়েন্স তৈরি করছে, যেমন peripherally নিচে (উল্লিখিত stackoverflow.com/a/8552128/2749397 ) আমি একটি বিট এই বৈশিষ্ট্যটি মন্তব্য করতে (যেমন আপনি এটি উল্লেখ করা হয়নি চাই হিসাবে ;-) আমি ' সবচেয়ে বেশি ভোট দেওয়া উত্তরকে যানবাহন হিসাবে ব্যবহার করার স্বাধীনতা নিচ্ছি ... ক্রম অক্ষরের দুটি উদাহরণ: echo {01..12}-> 01 02 03 04 05 06 07 08 09 10 11 12(প্রাথমিক শূন্য নোট করুন); echo {C..Q}-> C D E F G H I J K L M N O P Q। এর প্রধান ব্যবহারটি লুপগুলিতে রয়েছে, যেমন for cnt in {01..12} ; do ... ${cnt} ... ; done
gboffi

1
@ জিবিফফি: শূন্য প্যাডিং বৈশিষ্ট্যটি বাশ ৪ এ উপলভ্য হয়েছে Also এছাড়াও, বাশ ৪ এও আপনি একটি ক্রম অনুসারে একটি বৃদ্ধি উল্লেখ করতে পারেন: echo {01..12..2}-> "01 03 05 07 09 11"। অনুক্রম সম্পর্কে অনুস্মারক জন্য ধন্যবাদ। আমি আমার উত্তরে এটি যুক্ত করব।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

335
  1. একটি একক বন্ধনী ( [) সাধারণত নামক প্রোগ্রামকে কল করে [; man testবা man [আরও তথ্যের জন্য। উদাহরণ:

    $ VARIABLE=abcdef
    $ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
    yes
  2. ডাবল বন্ধনী ( [[) একই কাজ করে (মূলত) একক বন্ধনী হিসাবে, তবে এটি একটি ব্যাশ অন্তর্নির্মিত।

    $ VARIABLE=abcdef
    $ if [[ $VARIABLE == 123456 ]] ; then echo yes ; else echo no ; fi
    no
  3. প্যারেন্টিস ( ()) ব্যবহার করে একটি সাব-শেল তৈরি করতে ব্যবহৃত হয়। উদাহরণ স্বরূপ:

    $ pwd
    /home/user 
    $ (cd /tmp; pwd)
    /tmp
    $ pwd
    /home/user

    আপনি দেখতে পাচ্ছেন, সাব-শেল আপনাকে বর্তমান শেলের পরিবেশকে প্রভাবিত না করেই অপারেশন করার অনুমতি দেয়।

  4. (ক) ধনুর্বন্ধনী ( {}) ব্যবহার করে চলকগুলিকে নির্বিঘ্নে সনাক্ত করতে ব্যবহৃত হয়। উদাহরণ:

    $ VARIABLE=abcdef
    $ echo Variable: $VARIABLE
    Variable: abcdef
    $ echo Variable: $VARIABLE123456
    Variable:
    $ echo Variable: ${VARIABLE}123456
    Variable: abcdef123456

    (খ) ব্রেসগুলি বর্তমান শেল প্রসঙ্গে যেমন কমান্ডের ক্রম সম্পাদন করতে ব্যবহৃত হয় , যেমন

    $ { date; top -b -n1 | head ; } >logfile 
    # 'date' and 'top' output are concatenated, 
    # could be useful sometimes to hunt for a top loader )
    
    $ { date; make 2>&1; date; } | tee logfile
    # now we can calculate the duration of a build from the logfile

এর সাথে একটি সূক্ষ্ম সিনট্যাকটিক পার্থক্য রয়েছে ( ), যদিও ( বাশ রেফারেন্স দেখুন ); মূলত, ;ধনুর্বন্ধনী মধ্যে শেষ কমান্ড পরে একটি সেমিকোলন একটি আবশ্যক, এবং ধনুর্বন্ধনী {, ফাঁকা ফাঁকা দ্বারা আবদ্ধ করা } আবশ্যক


26
আসলে, [বাশের একটি বিল্টিন, তবে এটি বিল্টিনের /bin/[বিপরীতে যেমন কাজ করবে বলে মনে করা হচ্ছে [[[[আরও লজিকাল অপারেশন এবং বিভিন্ন উদ্ধৃতি রোলগুলির মতো বিভিন্ন বৈশিষ্ট্য রয়েছে। অতিরিক্তভাবে: একক বন্ধনীগুলি অ্যারে, প্রক্রিয়া প্রতিস্থাপন এবং বর্ধিত গ্লোবগুলির জন্যও ব্যবহৃত হয়; ডাবল বন্ধনী পাটিগণিতের জন্য ব্যবহৃত হয়; কোঁকড়া ধনুর্বন্ধনী {}কমান্ড গ্রুপিং বা পরামিতি সম্প্রসারণ বা ধনুর্বন্ধনী সম্প্রসারণ বা ক্রম সম্প্রসারণ প্রকারের বহুগুণ জন্য ব্যবহৃত হয়। আমি নিশ্চিত যে আমি কিছু অন্যান্য
ব্যবহারও

4
অভিব্যক্তির দ্বিগুণ সমান if [ $VARIABLE == abcdef ]একটি বাশিজম যা - যদিও এটি কাজ করে - সম্ভবত এড়ানো উচিত; হয় স্পষ্টভাবে ব্যাশ ( if [[ ...==...]]) ব্যবহার করুন বা এটি আরও পরিষ্কার করুন যে আপনি আরও প্রচলিত শর্তাধীন ( if [ "$VARIABLE" = "abcdef" ]) ব্যবহার করছেন । তর্কযুক্তভাবে, স্ক্রিপ্টগুলি যত তাড়াতাড়ি সম্ভব সহজ এবং বহনযোগ্য হিসাবে শুরু হওয়া উচিত, যতক্ষণ না তাদের সত্যিকারের জন্য ব্যাশ সম্পর্কিত নির্দিষ্ট বৈশিষ্ট্যগুলির প্রয়োজন হয় (এক কারণে বা অন্য কোনও কারণে)। তবে যে কোনও ক্ষেত্রে, উদ্দেশ্যটি পরিষ্কার হওয়া উচিত; "=" এবং "==" এবং "[[" এবং "[" আলাদাভাবে কাজ করে এবং তাদের ব্যবহারের সাথে সামঞ্জস্য হওয়া উচিত।
মাইকেল

3
@ মাইকেল_এন: এই মন্তব্যের জন্য +1 সাইড নোটে, আমি স্ক্রিপ্টিং পছন্দ করি, তবে আমি এটি বেশ বিশ্রী মনে করি যে পোর্টেবল উপায়টি [ "$var" = ".."]পরিবর্তে পরীক্ষা করা হয় ==, অন্যদিকে সিতে এটি পরীক্ষার পরিবর্তে বরাদ্দ করা হত (এবং বাগগুলির পক্ষে একটি সাধারণ কারণ) ... কেন হয়নি 'টি testব্যবহার ==পরিবর্তে =? কেউ জানে?
অলিভিয়ার ডুলাক

এছাড়াও এখানে একটি মজার বিষয় রয়েছে যে (কমপক্ষে কুবুন্টুতে) কমান্ডটি /usr/bin/[কোনও সিমিলিংক নয় /usr/bin/testএবং আরও অনেক কিছু: এই প্রোগ্রামগুলিতে এমনকি কয়েকটি আলাদা আকার রয়েছে!
হাই-এঞ্জেল

এছাড়াও: একটি একক সমাপ্তি প্রথম বন্ধনী )হ'ল caseকেস লাইনটি শেষ করতে স্টেটমেন্ট সিনট্যাক্সের অংশ । এটির একটি খোলার প্রথম বন্ধনী নেই। এটি প্রথমবার দেখেছিলে তা আমাকে ফেলে দেয়।
আগস্টান আমেনাবার

302

বন্ধনী

if [ CONDITION ]    Test construct  
if [[ CONDITION ]]  Extended test construct  
Array[1]=element1   Array initialization  
[a-z]               Range of characters within a Regular Expression
$[ expression ]     A non-standard & obsolete version of $(( expression )) [1]

[1] http://wiki.bash-hackers.org/scriptting/obsolete

কোঁকড়া ধনুর্বন্ধনী

${variable}                             Parameter substitution  
${!variable}                            Indirect variable reference  
{ command1; command2; . . . commandN; } Block of code  
{string1,string2,string3,...}           Brace expansion  
{a..z}                                  Extended brace expansion  
{}                                      Text replacement, after find and xargs

প্রথম বন্ধনী

( command1; command2 )             Command group executed within a subshell  
Array=(element1 element2 element3) Array initialization  
result=$(COMMAND)                  Command substitution, new style  
>(COMMAND)                         Process substitution  
<(COMMAND)                         Process substitution 

ডাবল পেরেন্টেসিস

(( var = 78 ))            Integer arithmetic   
var=$(( 20 + 5 ))         Integer arithmetic, with variable assignment   
(( var++ ))               C-style variable increment   
(( var-- ))               C-style variable decrement   
(( var0 = var1<98?9:21 )) C-style ternary operation

@ ইওলা, আপনি কি দয়া করে ব্যাখ্যা করতে পারেন $ (বর্ণটি) ঠিক কী করে? অ্যাপল এক্সকোড প্রকল্পগুলিতে, আমি স্ক্রিপ্ট ইনপুট / আউটপুট হিসাবে ফাইলের পাথগুলি নির্দিষ্ট করতে পারি। যদি আমি $ SRC_ROOT / myFile.txt বা $ {SRC_ROOT} /myFile.txt (SRC_ROOT var বিল্ড সিস্টেম দ্বারা রফতানি করা হয়) নির্দিষ্ট করে - কাজ করে না। কেবলমাত্র $ (SRC_ROOT) /myFile.txt কাজ করে। এর কারণ কী হতে পারে? স্পষ্টত var নাম কমান্ড না?
মোটি শ্নের

1
@ মোটিশিনার, আপনার ক্ষেত্রে $(varname)বাশ সিনট্যাক্সের সাথে সম্পর্কিত নয়। এটি মেকফিল সিনট্যাক্সের অংশ ।
সাশা

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

@ মোটিশ্নিয়র, ঠিক আছে, আসুন পরিমার্জন করুন: সম্ভবত এটি xcconfig বাক্যবিন্যাসের অংশ । যাইহোক, $(varname)আপনার ক্ষেত্রে বাশ সিনট্যাক্সের সাথে কোনও সম্পর্ক নেই।
সাশা

আপনি পরীক্ষা কন্সট্রাক্ট এবং বর্ধিত পরীক্ষা গঠনের মধ্যে পার্থক্য কী তা উল্লেখ করেন না।
নিকোস

23

আমি এইগুলি টিএলডিপি থেকে কেবল যুক্ত করতে চেয়েছিলাম :

~:$ echo $SHELL
/bin/bash

~:$ echo ${#SHELL}
9

~:$ ARRAY=(one two three)

~:$ echo ${#ARRAY}
3

~:$ echo ${TEST:-test}
test

~:$ echo $TEST


~:$ export TEST=a_string

~:$ echo ${TEST:-test}
a_string

~:$ echo ${TEST2:-$TEST}
a_string

~:$ echo $TEST2


~:$ echo ${TEST2:=$TEST}
a_string

~:$ echo $TEST2
a_string

~:$ export STRING="thisisaverylongname"

~:$ echo ${STRING:4}
isaverylongname

~:$ echo ${STRING:6:5}
avery

~:$ echo ${ARRAY[*]}
one two one three one four

~:$ echo ${ARRAY[*]#one}
two three four

~:$ echo ${ARRAY[*]#t}
one wo one hree one four

~:$ echo ${ARRAY[*]#t*}
one wo one hree one four

~:$ echo ${ARRAY[*]##t*}
one one one four

~:$ echo $STRING
thisisaverylongname

~:$ echo ${STRING%name}
thisisaverylong

~:$ echo ${STRING/name/string}
thisisaverylongstring

18
মনে রাখবেন যে echo ${#ARRAY}প্রদর্শন তিন, প্রথম উপাদান কারণ ARRAYতিনটি অক্ষর আছে, কারণ এটা তিনটি উপাদান রয়েছে! উপাদানগুলির সংখ্যাটি মুদ্রণের জন্য echo ${#ARRAY[@]}
সত্য

ভিজিয়েবল উপস্থিত থাকলে @zeal এর ${TEST:-test}সমান হয় , অন্যথায় এটি স্ট্রিংটিকে "পরীক্ষার" ফিরিয়ে দেয়। আরও একটি সংস্করণ রয়েছে যা আরও বেশি করে: --- যা টেস্টের উপস্থিতির সাথেও সমান , তবে যখনই তা না হয় এটি পরিবর্তনশীল তৈরি করে এবং একটি মান "পরীক্ষা" বরাদ্দ করে এবং পুরো এক্সপ্রেশনটির মানও হয়ে যায়। $TESTTEST${TEST:=test}$TESTTEST
সম্ভাব্যতা ভালোবাসে

18

পরীক্ষার মধ্যে পার্থক্য , [ এবং [[ বাশফ্যাকুতে দুর্দান্ত বিবরণে ব্যাখ্যা করা হয়েছে ।

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

[[এটির একটি নতুন উন্নত সংস্করণ যা মূলশব্দ, কোনও প্রোগ্রাম নয়। এটি নীচে প্রদর্শিত হিসাবে ব্যবহারের স্বাচ্ছন্দ্যে উপকারী প্রভাব ফেলে। [[কর্নশেল এবং BASH দ্বারা বোঝা যায় (উদাহরণস্বরূপ 2.03) তবে পুরানো পসিক্স বা বোর্নশেল দ্বারা নয় not

এবং উপসংহার:

নতুন পরীক্ষার কমান্ডটি কখন [[ব্যবহৃত হবে, এবং যখন পুরনোটি হবে]? বোর্নশেলের কাছে বহনযোগ্যতা যদি উদ্বেগের বিষয় হয় তবে পুরানো বাক্য গঠনটি ব্যবহার করা উচিত। অন্যদিকে স্ক্রিপ্টে যদি বেস বা কর্নশেলের প্রয়োজন হয় তবে নতুন সিনট্যাক্সটি আরও নমনীয়।


18

ফাংশন সংজ্ঞা পিতামহিনী

প্যারেন্টিসগুলি ()ফাংশন সংজ্ঞায় ব্যবহৃত হচ্ছে:

function_name () { command1 ; command2 ; }

কমান্ড প্যারামিটারেও আপনাকে বন্ধনীর হাত থেকে বাঁচতে হবে এ কারণেই:

$ echo (
bash: syntax error near unexpected token `newline'

$ echo \(
(

$ echo () { command echo The command echo was redefined. ; }
$ echo anything
The command echo was redefined.

ওহ, আমি চেষ্টা করেছি আমার খারাপ। আমি যখন ব্যাশে চেষ্টা করি তখন তা কার্যকর হয়। বাশের কমান্ড 'কমান্ড' আমি জানতাম না।
চ্যান কিম

আমি কীভাবে কমান্ড ইকো () এর পুনঃনির্ধারণ বাতিল করতে পারি? (ব্যাশ আবার খোলা ছাড়াই)
চ্যান কিম

2
@ChanKim: unset -f echo। দেখুন help unset
pabouk

0
Truncate the contents of a variable

$ var="abcde"; echo ${var%d*}
abc

Make substitutions similar to sed

$ var="abcde"; echo ${var/de/12}
abc12

Use a default value

$ default="hello"; unset var; echo ${var:-$default}
hello

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