Bash高级编程:变量

一、变量扩展

在Bsh和兼容它的shell中,以下的变量扩展形式根据变量的存在性、非空性进行条件扩展

${var-default}   # 若 var 不存在则扩展为 default,否则扩展为 $var
${var:-default}  # 同上,但当 var 为空时,处理与不存在相同

${var+alter}     # 若 var 存在则扩展为 alter,否则扩展为 $var
${var:+alter}    # 同上,但当 var 为空时,处理与不存在相同

${var=default}   # 与 ${var-default} 相同,且 var 会被赋值
${var:=default}  # 同上,但当 var 为空时,处理与不存在相同

${var?message}   # 若 var 不存在则打印 message 信息并以状态码 1 来终止脚本
${var:?message}  # 同上,但当 var 为空时,处理与不存在相同

在POSIX标准中,继承了一些来自Ksh的对于变量保存的字符串的修剪操作

${#var}     # 扩展为 var 所保存的字符串的长度
${var%P}    # 从 var 保存的字符串的末尾移除对 P 的最小匹配
${var%%P}   # 从 var 保存的字符串的末尾移除对 P 的最长匹配
${var#P}    # 从 var 保存的字符串的开头移除对 P 的最小匹配
${var##P}   # 从 var 保存的字符串的开头移除对 P 的最长匹配

Bash还继承了Ksh的一些字符串查找、替换、子串操作

${var/P/S}    # 将 var 保存的字符串的第一个对 P 的匹配替换为 S
${var//P/S}   # 将 var 保存的字符串的全部对 P 的匹配替换为 S
${var:O}      # 取 var 保存的字符串从 O 开始的子串
              # 当 O 为负数时,为了跟上面的条件扩展区分,:与-之前需要空格
              ${var:O:L}    # 取 var 保存的字符串从 O 开始长度为 L 的子串
              ${!var}       # 若 var 保存的内容为 X,则等价于 ${X}

Bash 4.0还引入了大小写转换的扩展:

${var^P}    # 将 var 保存的字符串的第一个对 P 的匹配转换为大写
${var^^P}   # 将 var 保存的字符串的所有对 P 的匹配转换为大写
${var,P}    # 将 var 保存的字符串的第一个对 P 的匹配转换为小写
${var,,P}   # 将 var 保存的字符串的所有对 P 的匹配转换为小写

一些特殊的替换还是需要使用辅助程序来做:

# 将 0 到 110 的所有数字用前导 0 对齐
for i in {0..110}; do echo -n "$(printf %03d $i) "; done

二、数组

普通的整数下标数组不需要声明,可以直接创建:

# 通过下标赋值创建
name[0]=Nicky
name[1]=Bell

# 或者直接通过列表创建
name=(Nicky Bell)

数组变量扩展规则:

${name[1]}   # 数组的第2个元素
${#name[@]}  # 数组元素的个数
${name[@]}   # 数组的元素列表
${name[*]}   # 数组的元素连接字符串

关联数组在使用前必须声明:

declare -A name
name[first]=Nicky
name[last]=Bell
echo ${name[@]}