উত্তর:
বাশে, 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
:
।
$[expression]
; এটি নতুন, পছন্দসই সিনট্যাক্সের জন্য পুরানো, অবচিত গণিত এক্সপ্রেশন সিনট্যাক্স:$((expression))
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
echo {01..12..2}
-> "01 03 05 07 09 11"। অনুক্রম সম্পর্কে অনুস্মারক জন্য ধন্যবাদ। আমি আমার উত্তরে এটি যুক্ত করব।
একটি একক বন্ধনী ( [
) সাধারণত নামক প্রোগ্রামকে কল করে [
; man test
বা man [
আরও তথ্যের জন্য। উদাহরণ:
$ VARIABLE=abcdef
$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
yes
ডাবল বন্ধনী ( [[
) একই কাজ করে (মূলত) একক বন্ধনী হিসাবে, তবে এটি একটি ব্যাশ অন্তর্নির্মিত।
$ VARIABLE=abcdef
$ if [[ $VARIABLE == 123456 ]] ; then echo yes ; else echo no ; fi
no
প্যারেন্টিস ( ()
) ব্যবহার করে একটি সাব-শেল তৈরি করতে ব্যবহৃত হয়। উদাহরণ স্বরূপ:
$ pwd
/home/user
$ (cd /tmp; pwd)
/tmp
$ pwd
/home/user
আপনি দেখতে পাচ্ছেন, সাব-শেল আপনাকে বর্তমান শেলের পরিবেশকে প্রভাবিত না করেই অপারেশন করার অনুমতি দেয়।
(ক) ধনুর্বন্ধনী ( {}
) ব্যবহার করে চলকগুলিকে নির্বিঘ্নে সনাক্ত করতে ব্যবহৃত হয়। উদাহরণ:
$ 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
এর সাথে একটি সূক্ষ্ম সিনট্যাকটিক পার্থক্য রয়েছে ( )
, যদিও ( বাশ রেফারেন্স দেখুন ); মূলত, ;
ধনুর্বন্ধনী মধ্যে শেষ কমান্ড পরে একটি সেমিকোলন একটি আবশ্যক, এবং ধনুর্বন্ধনী {
, ফাঁকা ফাঁকা দ্বারা আবদ্ধ করা }
আবশ্যক ।
[
বাশের একটি বিল্টিন, তবে এটি বিল্টিনের /bin/[
বিপরীতে যেমন কাজ করবে বলে মনে করা হচ্ছে [[
। [[
আরও লজিকাল অপারেশন এবং বিভিন্ন উদ্ধৃতি রোলগুলির মতো বিভিন্ন বৈশিষ্ট্য রয়েছে। অতিরিক্তভাবে: একক বন্ধনীগুলি অ্যারে, প্রক্রিয়া প্রতিস্থাপন এবং বর্ধিত গ্লোবগুলির জন্যও ব্যবহৃত হয়; ডাবল বন্ধনী পাটিগণিতের জন্য ব্যবহৃত হয়; কোঁকড়া ধনুর্বন্ধনী {}
কমান্ড গ্রুপিং বা পরামিতি সম্প্রসারণ বা ধনুর্বন্ধনী সম্প্রসারণ বা ক্রম সম্প্রসারণ প্রকারের বহুগুণ জন্য ব্যবহৃত হয়। আমি নিশ্চিত যে আমি কিছু অন্যান্য
if [ $VARIABLE == abcdef ]
একটি বাশিজম যা - যদিও এটি কাজ করে - সম্ভবত এড়ানো উচিত; হয় স্পষ্টভাবে ব্যাশ ( if [[ ...==...]]
) ব্যবহার করুন বা এটি আরও পরিষ্কার করুন যে আপনি আরও প্রচলিত শর্তাধীন ( if [ "$VARIABLE" = "abcdef" ]
) ব্যবহার করছেন । তর্কযুক্তভাবে, স্ক্রিপ্টগুলি যত তাড়াতাড়ি সম্ভব সহজ এবং বহনযোগ্য হিসাবে শুরু হওয়া উচিত, যতক্ষণ না তাদের সত্যিকারের জন্য ব্যাশ সম্পর্কিত নির্দিষ্ট বৈশিষ্ট্যগুলির প্রয়োজন হয় (এক কারণে বা অন্য কোনও কারণে)। তবে যে কোনও ক্ষেত্রে, উদ্দেশ্যটি পরিষ্কার হওয়া উচিত; "=" এবং "==" এবং "[[" এবং "[" আলাদাভাবে কাজ করে এবং তাদের ব্যবহারের সাথে সামঞ্জস্য হওয়া উচিত।
[ "$var" = ".."]
পরিবর্তে পরীক্ষা করা হয় ==
, অন্যদিকে সিতে এটি পরীক্ষার পরিবর্তে বরাদ্দ করা হত (এবং বাগগুলির পক্ষে একটি সাধারণ কারণ) ... কেন হয়নি 'টি test
ব্যবহার ==
পরিবর্তে =
? কেউ জানে?
/usr/bin/[
কোনও সিমিলিংক নয় /usr/bin/test
এবং আরও অনেক কিছু: এই প্রোগ্রামগুলিতে এমনকি কয়েকটি আলাদা আকার রয়েছে!
)
হ'ল case
কেস লাইনটি শেষ করতে স্টেটমেন্ট সিনট্যাক্সের অংশ । এটির একটি খোলার প্রথম বন্ধনী নেই। এটি প্রথমবার দেখেছিলে তা আমাকে ফেলে দেয়।
বন্ধনী
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
$(varname)
বাশ সিনট্যাক্সের সাথে সম্পর্কিত নয়। এটি মেকফিল সিনট্যাক্সের অংশ ।
$(varname)
আপনার ক্ষেত্রে বাশ সিনট্যাক্সের সাথে কোনও সম্পর্ক নেই।
আমি এইগুলি টিএলডিপি থেকে কেবল যুক্ত করতে চেয়েছিলাম :
~:$ 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
echo ${#ARRAY}
প্রদর্শন তিন, প্রথম উপাদান কারণ ARRAY
তিনটি অক্ষর আছে, কারণ এটা তিনটি উপাদান রয়েছে! উপাদানগুলির সংখ্যাটি মুদ্রণের জন্য echo ${#ARRAY[@]}
।
${TEST:-test}
সমান হয় , অন্যথায় এটি স্ট্রিংটিকে "পরীক্ষার" ফিরিয়ে দেয়। আরও একটি সংস্করণ রয়েছে যা আরও বেশি করে: --- যা টেস্টের উপস্থিতির সাথেও সমান , তবে যখনই তা না হয় এটি পরিবর্তনশীল তৈরি করে এবং একটি মান "পরীক্ষা" বরাদ্দ করে এবং পুরো এক্সপ্রেশনটির মানও হয়ে যায়। $TEST
TEST
${TEST:=test}
$TEST
TEST
পরীক্ষার মধ্যে পার্থক্য , [ এবং [[ বাশফ্যাকুতে দুর্দান্ত বিবরণে ব্যাখ্যা করা হয়েছে ।
একটি দীর্ঘ গল্প সংক্ষিপ্ত কাটা: পরীক্ষা কমান্ডের পুরানো, পোর্টেবল সিনট্যাক্স প্রয়োগ করে। প্রায় সমস্ত শেল (পুরানো বোর্ন শেল ব্যতিক্রম), [পরীক্ষার প্রতিশব্দ (তবে একটি চূড়ান্ত যুক্তি প্রয়োজন])। যদিও সমস্ত আধুনিক শাঁসের অন্তর্নির্মিত প্রয়োগগুলি রয়েছে [, সাধারণত এখনও সেই নামটির একটি বহিরাগত এক্সিকিউটেবল থাকে, যেমন / বিন / [bin
[[এটির একটি নতুন উন্নত সংস্করণ যা মূলশব্দ, কোনও প্রোগ্রাম নয়। এটি নীচে প্রদর্শিত হিসাবে ব্যবহারের স্বাচ্ছন্দ্যে উপকারী প্রভাব ফেলে। [[কর্নশেল এবং BASH দ্বারা বোঝা যায় (উদাহরণস্বরূপ 2.03) তবে পুরানো পসিক্স বা বোর্নশেল দ্বারা নয় not
এবং উপসংহার:
নতুন পরীক্ষার কমান্ডটি কখন [[ব্যবহৃত হবে, এবং যখন পুরনোটি হবে]? বোর্নশেলের কাছে বহনযোগ্যতা যদি উদ্বেগের বিষয় হয় তবে পুরানো বাক্য গঠনটি ব্যবহার করা উচিত। অন্যদিকে স্ক্রিপ্টে যদি বেস বা কর্নশেলের প্রয়োজন হয় তবে নতুন সিনট্যাক্সটি আরও নমনীয়।
প্যারেন্টিসগুলি ()
ফাংশন সংজ্ঞায় ব্যবহৃত হচ্ছে:
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.
unset -f echo
। দেখুন help unset
।
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