在shell中经常要对变量进行字符串的截取操作,虽然截取字符串的方法很多,在这里用${}的方法操作变量应该是最简洁的方式。
1. 最小匹配和最大匹配
shell脚本中经常要对输入的参数截取其路径或文件名,例如变量file中保存着输入参数:
file=/home/user/file1.txt
表达式 | 作用 | 结果 |
---|---|---|
${file#*/} | 删掉第一个 “/” 及其左边的字符串 | home/user/file1.txt |
${file##*/} | 删掉最后一个 “/” 及其左边的字符串 | file1.txt |
${file%/*} | 删掉最后一个 “/” 及其右边的字符串 | /home/user |
${file%%/*} | 删掉第一个 “/” 及其右边的字符串 | (空值) |
${file#*.} | 删掉第一个 “.” 及其左边的字符串 | txt |
${file##*.} | 删掉最后一个 “.” 及其左边的字符串 | txt |
${file%.*} | 删掉最后一个 “.” 及其右边的字符串 | /home/user/file1 |
${file%%.*} | 删掉第一个 “.” 及其右边的字符串 | /home/user/file1 |
这里的最大匹配和最小匹配与正则表达式是不是很像,但是用起来简单方便。
如果觉得不方便记忆,可以这样来看:
键盘上#、 $、%分别对应着3、4、5
- # 是 去掉左边(键盘上#在 $ 的左边)
- %是去掉右边(键盘上% 在$ 的右边)
- 一个符号是最小匹配;两个符号是最大匹配
因此,#/就是以"/"为末尾字符的最小匹配(从左到右),%/就是以"/"为开头字符的最小匹配(从右到左)。
2. 按长度截取字符串
仍然对上面的file变量进行操作,注意字符的位置从0开始
表达式 | 作用 | 结果 |
---|---|---|
${file:0:5} | 截取最左边的 5 个字符 | /home |
${file:1:5} | 截取从第2个字符开始的5个字符 | home/ |
${file:5:5} | 截取从第6个字符开始的5个字符 | /user |
3. 字符串替换
表达式 | 作用 | 结果 |
---|---|---|
${file/e/o} | 把变量中第一个字符"e"替换为字符"o" | /homo/user/file1.txt |
${file//e/o} | 把变量中全部字符"e"替换为字符"o" | /homo/usor/filo1.txt |
4.根据变量的赋值状态重新赋值
利用 ${ } 还可针对不同的变量赋值状态(未赋值、空值、非空值)返回不同的结果:
表达式 | 作用 |
---|---|
${file-/home} | 假如 $file 沒有赋值,則使用 /home 作传回值。($file为空值及非空值时返回变量本身) |
${file:-/home} | 假如 $file 沒有赋值或为空值,則使用 /home 作传回值。 ($file非空值时返回变量本身) |
${file+/home} | 假如 $file 有赋值(空值或非空值),则都使用 /home 作传回值。($file沒有赋值则不作处理) |
${file:+/home} | 假如 $file 为非空值,則使用 /home 作传回值。 ($file沒有赋值或为空值均不作处理) |
${file=/home} | 假如 $file 沒有赋值,則使用 /home 作传回值,同时将$file赋值为/home。(空值及非空值时不作处理) |
${file:=/home} | 假如 $file 沒有赋值或为空值,則使用 /home 作传回值,同时将$file赋值为/home。(非空值时不作处理) |
${file?/home} | 假如 $file 沒有赋值,則將 /home 输出至 STDERR,也就是一条包含/home内容的错误信息。(空值及非空值时不作处理) |
${file:?/home} | 假如 $file 沒有赋值或为空值,則將 /home 输出至 STDERR,(非空值时不作处理) |
${#file} | 返回 $file 变量字符串的长度 |
网友评论