shell中${}的使用

在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 变量字符串的长度

你可能感兴趣的:(shell中${}的使用)