執行
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