在bash shell中,$()与``(反引号)都是用来做命令替换(command substitution)的。
*完成引号里的命令行,然后将其结果替换出阿里,再重组命令行。
例如:
$ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)
${}会比较精确的界定变量名称的范围。${}的一些特异功能如下例说明。
例:
假设定义一个变量为:
file=/dir1/dir2/dir3/my.file.txt
我们可以用${}分别替换获得不同值
${file#*/}:拿掉第一条/及其左边的字串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最后一条/及其左边的字串:my.file.txt
${file#*.}:拿掉第一个.及其左边的字串:file.txt
${file##*.}:拿掉最后一个.及其左边的字串:txt
${file%/*}:拿掉最后一条/及其右边的字串:/dir1/dir2/dir3
${file%%/*}:拿掉第一条/及其右边的字串:(空值)
${file%.*}:拿掉最后一个.及其右边的字串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一个.及其右边的字串:/dir1/dir2/dir3/my
记忆的方法为:
#是去掉左边(在键盘上#在$的左边)
%是去掉右边(在键盘上%在$的右边)
单一符号是最小匹配;两给符号是最大匹配。
${file:0:5}:提取最左边的5个字节:/dir1
${file:5:5}:提取第5个字节右边的连续5个字节:/dir2
我们一颗一对变量值里的字串作替换:
${file/dir/path}:将第一个dir替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir替换为path:/path1/path2/path3/my.file.txt
利用${}还可以针对不同的变数状态复制(没设定、空值、非空值、):
${file-my.file.txt}:假如$file没有设定,则使用my.file.txt作传回值。(空值及非空值时不作处理)
${file:-my.file.txt}:假如$file没有设定或为空值,则使用my.file.txt作传回值。(非空值不作处理)
${file+my.file.txt}:假如$file为空值或非空值,均使用my.file.txt作传回值。(没设定时不作处理)
${file:+my.file.txt}:若$file为非空值,则使用my.file.txt作传回值。(没设定及空值时不作处理)
${file=my.file.txt}:若$file没设定,则使用my.file.txt作传回值,同时将$file赋值为my.file.txt。(空值及非空值时不作处理)
${file:=my.file.txt}:若$file没设定或为空值,则使用my.file.txt作传回值,同时将$file赋值为my.file.txt。(非空值时不作处理)
${file?my.file.txt}:若$file没设定,则将my.file.txt输出至STDERR。(空值及非空值不作处理)
${file:?my.file.txt}:若$file没设定或为空值,则将my.file.txt输出至STDERR。(非空值时不作处理)
以上的理解:一般而言,:与null有关,若不带:的话,null不受影响,若带:则连null也受影响。
${#var}:可计算出变量值的长度:
${#file}:可得到27,以为/dir1/dir2/dir3/my.file.txt刚好是27个字节
bash中的数组(array)的处理方法。
一般而言,A="a b c def"这样的变量知识将$A替换为一个单一的字串,
但是改为A=(a b c def),则是将$A定义为数组...
bash的数组替换方法可参考如下方法:
${A[@]} 或 ${A[*]}
可得到a b c def(全部元素)
${A[0]}
可得到a(第一个元素),${A[1]}则为第二个元素
${#A[@]}或${#A[*]}
可得到4(全部元素数量)
${#A[0]}
可得到1(即第一个元素(a)的长度),${#A[3]}可得到3(第四个元素(def)的长度)
A[3]=xyz
则是将第四个元素重新定义为xyz
$(())的用途:它是用来作整数运算的。
在bash中,$(())的整数原酸符号大致有如下这些:
+ - * /:分别为“加、减、乘、除“。
%:余数运算
& | ^ ! :分别为“AND、OR、XOR、NOT”运算。
$ a=5; b=7; c=2
$ echo $(( a+b*c ))
19
$ echo $(( (a+b)/c ))
6
$ echo $(( (a*b)%c))
1
在$(())中的变量名称,可在其前面加$符号來替换,也可以不用,如:
$(($a + $b * $c))也可得到19的结果
注:在$(())中,变量与运算符号之间是否有空格都是合法的。
此外,$(())还可以作不同进位(如二进制、八进制、十六进制)作运算,只是输出结果皆为十进制。
echo $((16#2a))结果为42(十六进制转为十进制)
例:假如当前的umask是022,那么新建文件的权限即为:
$ umask 022
$ echo "obase=8;$(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
644
事实上,单纯用(())也可以重定义变量值,或作testing:
a=5;((a++))可将$a重定义为6
a=5;((a--))则为a=4
a=5;b=7;((a<b))会得到0(true)的返回值
常见的用于(())的测试符号有如下这些:
<:小于
>:大于
<=:小于或等于
>=:大于或等于
==:等于
!=:不等于
注使用(())作整数测试时,不要跟[]的整数测试搞混乱了。