Linux系统中bash shell编程的10个基础问题讲解

2019-09-23 09:20:30王振洲

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。(非空值时不作处理)

Tips:

以上的理解在于,你一定要分清楚unset与null及non-null这三种赋值状态。一般而言,: 与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的数组替换方法可参考如下方法: