10.2 参数替换
参数替换用来处理或扩展变量。
${parameter}
${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}
${parameter-default}, ${parameter:-default}在没有设置变量的情况下使用缺省值。
var1=1
var2=2
# 没有设置 var3。
echo ${var1-$var2} # 1
echo ${var3-$var2} # 2
# ^ 注意前面的 $ 前缀。
echo ${username-`whoami`}
# 如果变量 $username 没有被设置,输出 `whoami` 的结果。
![]()
${parameter-default}与${parameter:-default}的作用几乎相同,唯一不同的情况就是当变量 parameter 已经被声明但值为空时。
当传入的命令行参数的数量不足时,可以使用这种缺省参数结构。
可以同 使用与链设置缺省命令行参数 做比较。
${parameter=default}, ${parameter:=default}
${parameter=default}, ${parameter:=default}在没有设置变量的情况下,将其设置为缺省值。
两种形式的作用几乎相同,唯一不同的情况与上面类似,就是当变量 parameter 已经被声明但值为空时。
${parameter+alt_value}, ${parameter:+alt_value}
${parameter+alt_value}, ${parameter:+alt_value}如果变量已被设置,使用 alt_value,否则使用空值。
两种形式的作用几乎相同,唯一不同的情况就是当变量 parameter 已经被声明但值为空时,看下面的例子。
${parameter?err_msg}, ${parameter:?err_msg}
${parameter?err_msg}, ${parameter:?err_msg}如果变量已被设置,那么使用原值,否则输出 err_msg 并且终止脚本,返回 错误码 1。
两种形式的作用几乎相同,唯一不同的情况与上面类似,就是当变量 parameter 已经被声明但值为空时。
样例 10-7. 如何使用变量替换和错误信息
样例 10-8. 参数替换与 "usage" 消息
参数替换用来处理或扩展变量。下面的表达式是对 expr 处理字符串的操作的补足(查看样例 16-9)。这些特殊的表达式通常养来解析文件的路径名。
变量长度 / 删除子串
$
$字符串的长度($var 中字符的个数)。对任意 数组 array,${#array} 返回数组中第一个元素的长度。
以下情况例外:
${#*}和${#@}返回位置参数的个数。任意数组 array,
${#array[*]}和${#array[@]}返回数组中元素的个数。
样例 10-9. 变量长度
${var#Pattern}, ${var##Pattern}
${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。
${var%%Pattern} 删除 $var 后缀部分匹配到的最长长度的 $Pattern。
在 Bash 的 第二个版本 中增加了一些额外的选择。
样例 10-10. 参数替换中的模式匹配
样例 10-11. 更改文件扩展名:
变量扩展 / 替换子串
下面这些结构采用自 ksh。
${var:pos}
${var:pos}扩展为从偏移量 pos 处截取的变量 var。
${var:pos:len}
${var:pos:len}扩展为从偏移量 pos 处截取变量 var 最大长度为 len 的字符串。
${var/Pattern/Replacement}
${var/Pattern/Replacement}替换 var 中第一个匹配到的 Pattern 为 Replacement。
如果 Replacement 被省略,那么匹配到的第一个 Pattern 将被替换为空,即删除。
${var//Pattern/Replacement}
${var//Pattern/Replacement}全局替换。替换 var 中所有匹配到的 Pattern 为 Replacement。
跟上面一样,如果 Replacement 被省略,那么匹配到的所有 Pattern 将被替换为空,即删除。
样例 10-12. 使用模式匹配解析任意字符串
${var/#Pattern/Replacement}
${var/#Pattern/Replacement}替换 var 前缀部分匹配到的 Pattern 为 Replacement。
${var/%Pattern/Replacement}
${var/%Pattern/Replacement}替换 var 后缀部分匹配到的 Pattern 为 Replacement。
样例 10-13. 在字符串首部或尾部进行模式匹配
${!varprefix*}, ${!varprefix@}
${!varprefix*}, ${!varprefix@}匹配先前声明过所有以 varprefix 作为变量名前缀的变量。
Last updated
Was this helpful?
