1.操作和扩展变量
${parameter}
与$parameter 相同,就是 parameter 的值.在特定的上下文中,只有少部分会产生${parameter}的混淆.可以组合起来一起赋指给字符串变量.
${parameter-default},${parameter:-default}
如果 parameter 没被 set,那么就使用 default.注意:${parameter-default}和${parameter:-default}大部分时候是相同的.额外的":"在 parameter 被声明的时候(而且被赋空值),会有一些不同.例:
variable=
# 变量已经被声明了,但是被设置为空.
echo "${variable-0}" # (no output)
echo "${variable:-1}" # 1
${parameter=default},${parameter:=default}
如果 parameter 未设置,那么就设置为 default.这两种办法绝大多数时候用法都一样,只有在$parameter 被声明并设置为空的时候,才会有区别和上边的行为一样.
${parameter+alt_value},${parameter:+alt_value}
如果 parameter 被 set 了,那就使用 alt_value,否则就使用 null 字符串.
这两种办法绝大多数时候用法都一样,只有在$parameter 被声明并设置为空的时候,会有区别,见下.
param5=
a=${param5:+xyz}
echo "a = $a" # a =
# 与 a=${param5+xyz}有不同的结果.
${parameter?err_msg}, ${parameter:?err_msg}
如果 parameter 被 set,那就是用 set 的值,否则 print err_msg.
这两种办法绝大多数时候用法都一样,只有在$parameter 被声明并设置为空的时候,会有区别,见上.
2.参数替换和扩展
下边的表达式是使用 expr 字符串匹配操作的补充,这些特定的使用方法绝大多数情况都是用来分析文件目录名.
2.1变量长度/子串删除
${#var} 字符串长度($var 的字符数量).对于一个数组,${#array}是数组中第一个元素的长度.一些例外:
${#*}和${#@}将给出位置参数的个数.
对于数组来说${#array[*]}和${$#array[@]}将给出数组元素的个数
${var#Pattern}, ${var##Pattern}
从$var 开头删除最近或最远匹配$Pattern 的子串.
${var%Pattern}, ${var%%Pattern}
从$var 结尾删除最近或最远匹配$Pattern 的子串.
记住, # 和## 从字符串的左边开始,并且去掉左边的字符串, % 和 %% 从字符串的右边开始,并且去掉右边的子串.
2.2 变量扩展/子串替换
${var:pos}变量 var 从位置 pos 开始扩展.
${var:pos:len}从位置 pos 开始,并扩展 len 长度个字符
${var/Pattern/Replacement}使用 Replacement 来替换 var 中的第一个 Pattern 的匹配.
${var//Pattern/Replacement}全局替换.在 var 中所有的匹配,都会用 Replacement 来替换.如果 Replacement 被忽略的话,那么所有匹配到的 Pattern 都会被删除.
${var/#Pattern/Replacement}
如果 var 的前缀匹配到了 Pattern,那么就用 Replacement 来替换 Pattern.
${var/%Pattern/Replacement}
如果 var 的后缀匹配到了 Pattern,那么就用 Replacement 来替换 Pattern
注意:必须在开头或结尾匹配,否则,将不会产生替换结果.
${!varprefix*}, ${!varprefix@}使用变量的前缀来匹配前边所有声明过的变量.如:
xyz23=whatever
xyz24=
a=${!xyz*} # 以"xyz"作为前缀,匹配所有前边声明过的变量.
echo "a = $a" # a = xyz23 xyz24
a=${!xyz@} # 同上.
echo "a = $a" # a = xyz23 xyz24
阅读(1147) | 评论(0) | 转发(0) |