shell大括号参数扩展

假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt

字符串截取按分隔符截取

* ${file#*/}截取第一个/右边的字符串 dir1/dir2/dir3/my.file.txt
* ${file##*/}截取最后一个/右边的字符串 my.file.txt
* ${file%/*}截取最后一个/左边的字符串 /dir1/dir2/dir3
* ${file%%/*}截取第一个/左边的字符串 (空值)

总结

* #语法为 # * separator 截取separator右边的字符串
* %语法为 % separator *截取separator左边的字符串
* 一个#或%表示贪婪截取
* 两个#或%标示非贪婪截取

substring

* ${file:0:5}从0开始,截取5个字符/dir1
* ${file:5:5}从5开始,截取5个字符/dir2
* ${file::5}从0开始,截取5个字符/dir1

总结

substring表达式语法为${var:pos:length}, 标示对变量var从pos开始截取length个字符,pos为空标示0

字符串替换

* ${file/dir/path}把第一个dir替换成path:/path1/dir2/dir3/my.file.txt
* ${file//dir/path}把所有dir替换成path:/path1/path2/path3/my.file.txt

总结

字符串替换表达式语法为${var/src/dst}或${var//src/dst}。一个/标示替换第一个src两个//标示替换所有src

默认值

* ${file-my.file.txt}:$file没有设定,则使用my.file.txt返回,$file空值不做处理
* ${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并返回,空值不处理
* ${file:=my.file.txt}:$file没有设定或者为空值,则把my.file.txt复制给$file并返回
* ${file?my.file.txt}:$file没有设定,把my.file.txt输出到STDERR, 空值不做处理
* ${file:?my.file.txt}:$file没有设定或为空值,把my.file.txt输出到STDERR

总结

* -变量不存在返回默认值
* +变量存在返回默认值
* =变量不存在赋值并返回默认值
* ?变量不存在默认值输出到STDERR
* 没有:未设定为不存在,空值有意义
* 有:未设定和空值均标示不存在

其他

* ${#file} 返回字符串长度
* ${file: -4}返回字符串最后四个字节,注意和${file:-4}的区别

本文系转载,地址现在已经不记得了。

标签:linux, shell, bash, 大括号, 扩展

添加新评论