shell | {}和()


執行

bash -n xx.sh用於檢測腳本語法是否有錯誤
bash -x xx.sh用於追蹤執行

${var}

用於限定變量名稱的范圍,並且支持通配符

$(cmd)

shell會先執行括號的cmd,然后將結果作為變量進行替換,替換只能替換標准輸出,錯誤輸出不能替換。

一串命令的()和{}

  • ()是重新開一個子shell然后執行,而{}則是在當前shell里執行。
  • ()最后一個命令可以不用分號,{}最后一個命令要用分號。
  • ()里第一個命令和左邊括號不必有空格,而{}第一個命令和左括號之間必須有一個空格。
  • (){}里的某個命令的重定向只影響該命令, 而括號外的重定向則影響到括號里的所有命令。
root@guo:~/initramfs# var=test
root@guo:~/initramfs# echo var
var
root@guo:~/initramfs# echo $var
test
root@guo:~/initramfs# (var=notest;echo $var)
notest
root@guo:~/initramfs# {var=notest;echo $var}
{var=notest: command not found
test}
root@guo:~/initramfs# {var=notest;echo $var;}
-su: syntax error near unexpected token `}'
root@guo:~/initramfs# { var=notest;echo $var;}
notest
root@guo:~/initramfs# echo $var
notest

從上線可以看出,{}修改了變量的值。表明在當前shell中運行的。

root@guo:~/initramfs# var=test
root@guo:~/initramfs# echo $var
test
root@guo:~/initramfs# (var=notest;echo $var)
notest
root@guo:~/initramfs# echo $var
test

從上面可以看出()里的執行完畢后沒有改變變量的值,說明在子shell中執行的。

特殊替換

${var:-string} 和 ${var:=string}

當變量var為空或未定義時,則在命令行中用string替換:${var:-string}
若var不為空時,則用變量var的值,而不進行替換。

root@guo:~/initramfs/bin# echo $a

root@guo:~/initramfs/bin# echo ${a:-bcc}
bcc
root@guo:~/initramfs/bin# echo $a

root@guo:~/initramfs/bin# a=test
root@guo:~/initramfs/bin# echo ${a:-bcc}
test
root@guo:~/initramfs/bin# unset a
root@guo:~/initramfs/bin# echo $a

root@guo:~/initramfs/bin# echo ${a:=bcc}
bcc
root@guo:~/initramfs/bin# echo $a
bcc

${var:=string}則是當變量var為空時,則將string賦值給var。

${var:+string}

當var不為空時才替換成string,若var為空,則不替換或替換成var的值,即空

root@guo:~/initramfs/bin# a=test
root@guo:~/initramfs/bin# echo $a
test
root@guo:~/initramfs/bin# echo ${a:+bcd}
bcd
root@guo:~/initramfs/bin# echo $a
test
root@guo:~/initramfs/bin# unset a
root@guo:~/initramfs/bin# echo $a

root@guo:~/initramfs/bin# echo ${a:+bcd}

${var:?string}

當var不為空時,則用var的值來替換,而當var為空時,則把string輸出到STDERR中,並退出腳本。一般用此來檢測是否設置了變量的值

root@guo:~/initramfs/bin# echo $a

root@guo:~/initramfs/bin# echo ${a:?bcd}
-su: a: bcd
root@guo:~/initramfs/bin# a=test
root@guo:~/initramfs/bin# echo ${a:?bcd}
test

$((exp))

符合C語言的運算符都在里面進行計算。包括三目運算符,不支持浮點型和字符串,只支持整型計算

root@guo:~/initramfs/bin# echo $(3+2)
3+2: command not found

root@guo:~/initramfs/bin# echo $((3+2))
5

模式替換

${var%pattern},${var%%pattern} 從右邊開始匹配
${var#pattern},${var##pattern} 從左邊開始匹配
${var%pattern} ,${var#pattern} 表示最短匹配,匹配到就停止,非貪婪
${var%%pattern},${var##pattern} 是最長匹配

只有在pattern中使用了通配符才能有最長最短的匹配,否則沒有最 長最短匹配之分
結構中的pattern支持通配符
* 表示零個或多個任意字符
?表示零個或一個任意字符
[...]表示匹配中括號里面的字符
[!...]表示不匹配中括號里面的字符

root@guo:~/initramfs/bin# f=a.tar.gz
root@guo:~/initramfs/bin# echo ${f#*.}
tar.gz  *匹配的a
root@guo:~/initramfs/bin# echo ${f##*.}
gz   最長匹配,匹配到了后面的.
root@guo:~/initramfs/bin# echo ${f%.*}
a.tar
root@guo:~/initramfs/bin# echo ${f%%.*}
a

==和=

== 可用於判斷變量是否相等,=除了可用於判斷變量是否相等外,還可以表示賦值
(( ))= 表示賦值, == 表示判斷(整數比較),它們不等價

root@guo:~/initramfs/bin# ((n=5))
root@guo:~/initramfs/bin# echo $n
5
root@guo:~/initramfs/bin# ((n==5)) && echo "equal"
equal


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM