假设我们定义了一个变量为: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}, 标示对变量varpos开始截取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}的区别