Linux Shell编程之参数和变量扩展
linux shell参数扩展
${param}
拓展变量的值,以及防止变量被错误解析,比如:${hello}world、${arr[1]}
${arr[*]} 或 ${arr[@]}:返回数组 arr 的所有元素
${!param}
bash 2 中可以使用 ${!param} 来进行间接引用,比如 ${!#} 返回最后一个位置参数
${!arr[*]} 或 ${!arr[@]}:返回数组 arr 的所有下标
删除匹配子串
${param#pattern}:从 param 开头删除 pattern 匹配的子串(最小匹配)
${param#pattern}:从 param 开头删除 pattern 匹配的子串(最大匹配)
${param%pattern}:从 param 结尾删除 pattern 匹配的子串(最小匹配)
${param%%pattern}:从 param 结尾删除 pattern 匹配的子串(最大匹配)
提取子串
${param:offset}:提取 param 中从位置 offset 开始的子串(offset 从 0 开始)。如果 offset 为负数,表示从字符串结尾开始,此时 offset 必须被括号括起来,或者在 offset 之前加一个空格
${param:offset:length}:提取 param 中从 offset 开始的长度为 length 的子串,其他同上
param 可以为 * 或 @,表示对位置参数进行分片操作,比如 ${@:3:2} 返回从第 3 个位置参数开始的 2 个位置参数
根据变量状态赋值
${var-string}:若 var 未定义,则返回 string,否则返回 var 的值
${var:-string}:若 var 未定义或为空,则返回 string,否则返回 var 的值
${var=string}:若 var 未定义,则将 string 赋给 var,然后返回 var 的值,否则直接返回 var 的值
${var:=string}:若 var 未定义或为空,则将 string 赋给 var,然后返回 var 的值,否则直接返回 var 的值
${var+string}:若 var 已定义,则返回 string,否则返回 var 的值
${var:+string}:若 var 为非空,则返回 string,否则返回 var 的值
${var?string}:若 var 未定义,则将 string 输出到标准错误,并退出脚本,否则返回 var 的值
${var:?string}:若 var 未定义或为空,则将 string 输出到标准错误,并退出脚本,否则返回 var 的值
模式替换
${param/pattern/string}:将 param 中第一个匹配 pattern 的子串替换为 string
${param//pattern/string}:将 param 中所有匹配 pattern 的子串替换为 string
${param/#pattern/string}:如果 param 开头匹配 pattern,则将开头替换为 string
${param/%pattern/string}:如果 param 结尾匹配 pattern,则将结尾替换为 string
如果 param 是 @ 或 *,表示对所有的位置参数进行模式替换
如果 param 为 arr[@] 或 arr[*],则表示对数组中所有的元素进行模式替换
变量长度和个数
${#param}:返回 param 值的长度
${#*} 和 ${#@}:返回位置参数的个数
${arr[*]} 和 ${arr[@]}:返回数组 arr 的元素个数
变量大小写转换
${param^pattern}:pattern 为单个字符,将 param 中第一个匹配 pattern 的字符转换为大写
${param^^pattern}:pattern 为单个字符,将 param 中所有匹配 pattern 的字符转换为大写
${param,pattern}:pattern 为单个字符,将 param 中第一个匹配 pattern 的字符转换为小写
${param,,pattern}:pattern 为单个字符,将 param 中所有匹配 pattern 的字符转换为小写
param 可以为 * 或 @ 或 arr[*] 或 arr[@]
如果 pattern 为空,则将其视为 ?,表示匹配任意字符