处理和(或)扩展变量
${parameter}
与 $parameter 相同, 也就是变量 parameter 的值.
${parameter-default} , ${parameter:-default}
${parameter-default} – 如果变量parameter没被声明, 那么就使用默认值.
${parameter:-default} – 如果变量parameter没被设置, 那么就使用默认值.
*${parameter-default}和${parameter:-default}在绝大多数情况下都是相同的.只有在parameter已经被声明, 但是被赋null值得时候, 才会产生不同的结果.
#!/bin/bash
# parameter_sub.sh
username0=
echo "username0 has been declared, but is set to null."
echo "username0 = ${username0-`whoami`}" # 不会有输出.
echo
echo "username1 has not been declared."
echo "username1 = ${username1-`whoami`}" # 输出默认值.
username2=
echo "username2 has been declared, but is set to null."
echo "username2 = ${username2:-`whoami`}" # 会输出,因为:-比-多一个条件测试.
variable=
echo "${variable-0}" # (没有输出)
echo "${variable:-1}" # 1
unset variable
echo "${variable-2}" # 2
echo "${variable:-3}" # 3
exit 0
${parameter=default} , ${parameter:=default}
${parameter=default} – 如果变量parameter没声明, 那么就把它的值设为default.
${parameter:=default} – 如果变量parameter没设置, 那么就把它的值设为default.
echo ${username=`whoami`}
# 变量 "username" 现在被赋值为`whoami`.
${parameter+alt_value}, ${parameter:+alt_value}
${parameter+alt_value} – 如果变量parameter被声明了, 那么就使用 alt_value , 否则就使用null字符串.
${parameter:+alt_value} – 如果变量parameter被设置了, 那么就使用 alt_value , 否则就使用
null字符串.
#!/bin/bash
# ${parameter+alt_value} & ${parameter:+alt_value}
echo "##### \${parameter+alt_value} #####"; echo
a=${param1+xyz}
echo "a = $a" # a =
param2=
a=${param2+xyz}
echo "a = $a" # a = xyz
param3=123
a=${param3+xyz}
echo "a = $a" # a = xyz
echo
echo "##### \${parameter:+alt_value} #####";echo
a=${param4:+xyz}
echo "a = $a" # a =
param5=
a=${param5:+xyz}
echo "a = $a" # a =
param6=123
a=${param6:+xyz}
echo "a = $a" # a = xyz
exit 0
${parameter?err_msg} , ${parameter:?err_msg}
${parameter?err_msg} – 如果parameter已经被声明, 那么就使用设置的值, 否则打印err_msg错误消息.
${parameter:?err_msg} – 如果parameter已经被设置, 那么就使用设置的值, 否则打印err_msg错误消息.
变量长度/子串删除
${#var}
字符串长度 (变量 $var 得字符个数).对于array来说, ${#array}表示的是数组中第一个元素的长度.
例外情况:
${#*}和${#@}表示位置参数的个数 .
对于数组来说, ${#array[*]}和${#array[@]}表示数组中元素的个数.
${var#Pattern} , ${var##Pattern}
从变量 $var 的 开头 删除最短或最长匹配 $Pattern 的子串(“#”表示最短,”##”表示最长).
${var%Pattern} , ${var%%Pattern}
从变量 $var 的 结尾 删除最短或最长匹配 $Pattern 的子串.
变量扩展/子串替换
${var:pos}
变量 var 从位置 pos 开始扩展(也就是pos之前的字符都丢弃).
${var:pos:len}
变量 var 从位置 pos 开始, 并扩展 len 个字符.
${var/Pattern/Replacement}
使用 Replacement 来替换变量 var 中第一个匹配 Pattern 的字符串.
如果省略 Replacement , 那么第一个匹配 Pattern 的字符串将被替换为空, 也就是被删除了.
${var//Pattern/Replacement}
全局替换. 所有在变量 var 匹配 Pattern 的字符串, 都会被替换为 Replacement .
${var/#Pattern/Replacement}
如果变量 var 的前缀匹配 Pattern , 那么就使用 Replacement 来替换匹配到 Pattern 的字符串.
${var/%Pattern/Replacement}
如果变量 var 的后缀匹配 Pattern , 那么就使用 Replacement 来替换匹配到 Pattern 的字符串.
#!/bin/bash
# var-match.sh
v0=abc1234zip1234abc
echo "v0 = $v0" # abc1234zip1234abc
echo
# 匹配字符串的前缀(开头)
v1=${v0/#abc/ABCDEF}
echo "v1 = $v1" #ABCDEF1234zipabc
# 匹配字符串的前缀(开头)
v2=${v0/%abc/ABCDEF}
echo "v2 = $v2" #abc1234zipABCDEF
# 必须匹配字符串的开头或结尾,否则是不会产生替换结果的.
v3=${v0/#123/000} # 匹配但不在开头.
echo "v3 = $v3" # abc1234zip1234abc
#+不会发生替换.
v4=${v0/%123/000} # 匹配但不在结尾.
echo "v4 = $v4" # abc1234zip1234abc
#+不会发生替换.
exit 0
${!varprefix*} , ${!varprefix@}
匹配所有之前声明过的, 并且以varprefix 开头的变量.
xyz1=whatever
xyz2=
a=${!xyz*} # 展开所有以"xyz"开头的,并且之前声明过的变量名.
echo "a = $a" # a = xyz1 xyz2
a=${!xyz@} # 展开所有以"xyz"开头的,并且之前声明过的变量名.
echo "a = $a" # a = xyz1 xyz2