10.2 参数替换

参数替换用来处理或扩展变量。

${parameter}

等同于 $parameter,是变量 parameter 的值。在一些特定的环境下,只允许使用不易混淆的 ${parameter} 形式。

可以用于连接变量与字符串。

your_id=${USER}-on-${HOSTNAME}
echo "$your_id"
# 
echo "Old \$PATH = $PATH"
PATH=${PATH}:/opt/bin  # 在脚本执行过程中临时在 $PATH 中加入 /opt/bin。
echo "New \$PATH = $PATH"

${parameter-default}, ${parameter:-default}

在没有设置变量的情况下使用缺省值。

var1=1
var2=2
# 没有设置 var3。

echo ${var1-$var2}   # 1
echo ${var3-$var2}   # 2
#           ^          注意前面的 $ 前缀。



echo ${username-`whoami`}
# 如果变量 $username 没有被设置,输出 `whoami` 的结果。

note ${parameter-default}${parameter:-default} 的作用几乎相同,唯一不同的情况就是当变量 parameter 已经被声明但值为空时。

当传入的命令行参数的数量不足时,可以使用这种缺省参数结构。

可以查看 样例 3-4样例 31-2样例 A-6

可以同 使用与链设置缺省命令行参数 做比较。

${parameter=default}, ${parameter:=default}

在没有设置变量的情况下,将其设置为缺省值。

两种形式的作用几乎相同,唯一不同的情况与上面类似,就是当变量 parameter 已经被声明但值为空时。

${parameter+alt_value}, ${parameter:+alt_value}

如果变量已被设置,使用 alt_value,否则使用空值。

两种形式的作用几乎相同,唯一不同的情况就是当变量 parameter 已经被声明但值为空时,看下面的例子。

${parameter?err_msg}, ${parameter:?err_msg}

如果变量已被设置,那么使用原值,否则输出 err_msg 并且终止脚本,返回 错误码 1。

两种形式的作用几乎相同,唯一不同的情况与上面类似,就是当变量 parameter 已经被声明但值为空时。

样例 10-7. 如何使用变量替换和错误信息

样例 10-8. 参数替换与 "usage" 消息

参数替换用来处理或扩展变量。下面的表达式是对 expr 处理字符串的操作的补足(查看样例 16-9)。这些特殊的表达式通常养来解析文件的路径名。

变量长度 / 删除子串

$

字符串的长度($var 中字符的个数)。对任意 数组 array,${#array} 返回数组中第一个元素的长度。

note 以下情况例外:

  • ${#*}${#@} 返回位置参数的个数。

  • 任意数组 array,${#array[*]}${#array[@]} 返回数组中元素的个数。

样例 10-9. 变量长度

${var#Pattern}, ${var##Pattern}

${var#Pattern} 删除 $var 前缀部分匹配到的最短长度的 $Pattern

${var##Pattern} 删除 $var 前缀部分匹配到的最长长度的 $Pattern

摘自 样例 A-7 的例子:

下面是由 Manfred Schwarb 提供的上述函数的改进版本:

另外一个样例:

${var%Pattern}, ${var%%Pattern}

${var%Pattern} 删除 $var 后缀部分匹配到的最短长度的 $Pattern

${var%%Pattern} 删除 $var 后缀部分匹配到的最长长度的 $Pattern

在 Bash 的 第二个版本 中增加了一些额外的选择。

样例 10-10. 参数替换中的模式匹配

样例 10-11. 更改文件扩展名:

变量扩展 / 替换子串

下面这些结构采用自 ksh。

${var:pos}

扩展为从偏移量 pos 处截取的变量 var。

${var:pos:len}

扩展为从偏移量 pos 处截取变量 var 最大长度为 len 的字符串。

${var/Pattern/Replacement}

替换 var 中第一个匹配到的 Pattern 为 Replacement。

如果 Replacement 被省略,那么匹配到的第一个 Pattern 将被替换为空,即删除。

${var//Pattern/Replacement}

全局替换。替换 var 中所有匹配到的 Pattern 为 Replacement。

跟上面一样,如果 Replacement 被省略,那么匹配到的所有 Pattern 将被替换为空,即删除。

样例 10-12. 使用模式匹配解析任意字符串

${var/#Pattern/Replacement}

替换 var 前缀部分匹配到的 Pattern 为 Replacement。

${var/%Pattern/Replacement}

替换 var 后缀部分匹配到的 Pattern 为 Replacement。

样例 10-13. 在字符串首部或尾部进行模式匹配

${!varprefix*}, ${!varprefix@}

匹配先前声明过所有以 varprefix 作为变量名前缀的变量。

Last updated

Was this helpful?