假设我们定义一个变量为:
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}:从左边开始提取从第0位开始的长度为5个字符长度的内容:/dir1
${file:5:5}:从左边开始提取从第5位开始的长度为5个字符长度的内容:/dir2
${file: -4}: 只提取最后4位:.txt
${file::-4}:删除最4位字符:/dir1/dir2/dir3/my.file (GNU bash, version 4.2.8上测试通过)
${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 定义为非空值。(保留空值及非空值)
${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。 (保留非空值)
还有哦,${#var} 可计算出变量值的长度:
${#file} 可得到 27 ,因为 /dir1/dir2/dir3/my.file.txt 刚好是 27 个字节...
转载于:https://blog.51cto.com/huoxiubo/788453