参数替换

处理和(或)扩展变量

${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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值