BashScript 参数替换完全指南
4 min read · March 29th 2017
${parameter}
等同 $paramter,常见于拼接字符串时,使变量表述更清晰
var=1
var_default=2
echo ${var}_default # 1
echo $var_default # 2
${parameter-default}, ${parameter:-default}
如果参数 parameter 没有设置,使用 default 值
var1=1
var2=2
echo ${var3-$var1} # 1
echo ${var2-$var1} # 2
${parameter:-default}与 ${parameter-default}不同之处在于: parameter 声明了但为空时, ${parameter-default}认为 parameter 已设置,而 ${parameter:-default}认为 parameter 没有设置
var1=
echo ${var1-1} # 空
echo ${var1:-1} # 1
${parameter=default}, ${parameter:=default}
如果参数 parameter 没有设置,设置 parameter 值为 default, 并返回 default
var1=1
echo ${var1=2} # 1
echo ${var2=2} # 2
echo $var2 # 2
{parameter=default}与 ${parameter-default}不同之处在于:parameter 没有设置时,{parameter=default}返回 default 的同时设置参数 parameter 值为 default
${parameter:=default}与 ${parameter=default}不同之处在于: parameter 声明了但为空时, ${parameter=default}认为 parameter 已设置,而 ${parameter:=default}认为 parameter 没有设置
var1=
echo ${var1-1} # 空
echo $var1 # 空
echo ${var1:-1} # 1
echo $var1 # 1
${parameter+alt}, ${parameter:+alt}
如果参数 parameter 有设置,返回 alt
var1=1
echo ${var1+2} # 2
echo ${var2+2} # 空
${parameter:+alt}与 ${parameter+alt}不同之处在于: parameter 声明了但为空时, ${parameter+alt}认为 parameter 已设置,而 ${parameter:+alt}认为 parameter 没有设置
var1=
echo ${var1+2} # 2
echo ${var1:+2} # 空
${parameter?err_msg}, ${parameter:?err_msg}
如果参数 parameter 没有设置,打印 err_msg 并中断执行,且退出状态为 1
var1=1
echo ${var1?bad} # 1
echo ${var2?bad} # var2: bad
#查看退出状态
echo $? # 1
${parameter:?err_msg}与 ${parameter?err_msg}}不同之处在于: parameter 声明了但为空时, ${parameter?err_msg}认为 parameter 已设置,而 ${parameter:?err_msg}认为 parameter 没有设置
var1=
echo ${var1?bad} # 空
echo ${var1:?bad} # var1: bad
#查看退出状态
echo $? # 1
${#var}
变量 $var 的字符数
var1=abc
echo ${#var1} # 3
当 $var 为数组时,${#var}返回数组第一个元素的字符数,${#var[*]}和 ${#var[@]}返回数组个数
declare -A a
a[0]=abc
a[1]=def
echo ${#a} # 3
echo ${#a[@]} # 2
echo ${#a[*]} # 3
b=(abc def)
echo ${#b} # 3
echo ${#b[@]} # 2
echo ${#b[*]} # 3
${var#Pattern}, ${var##Pattern}
从 $var 的头部开始匹配 Pattern,移除匹配的部分,返回剩余部分
var=abc
echo ${a#a} # bc
echo ${a#ab} # c
echo ${a#abc} # 空
echo ${a#bc} # abc
${var##Pattern}与 ${var#Pattern}不同之处在于:${var#Pattern}进行尽可能少的匹配,而 ${var##Pattern}尽可能多的匹配
var=abaaab
echo ${var#ab*a} # aab
echo ${var##ab*a} # b
${var%Pattern}, ${var%%Pattern}
从 $var 的尾部开始匹配 Pattern,移除匹配的部分,返回剩余部分
var=abc
echo ${a%c} # ab
echo ${a%bc} # a
echo ${a%abc} # 空
echo ${a%ab} # abc
${var%%Pattern}与 ${var%Pattern}不同之处在于:${var%Pattern}进行尽可能少的匹配,而 ${var%Pattern}尽可能多的匹配
var=baaaba
echo ${var%a*ba} # baa
echo ${var%%a*ba} # b
${var:pos}
从 pos+1 处开始截取 $var
var=abcdef
echo ${var:0} # abcdef
echo ${var:1} # bcdef
echo ${var:6} # 空
echo ${var:7} # 空
echo ${var:-1} # abcdef, 当 pos 为负数,直接返回 $var
${var:pos:len}
从 pos+1 处开始截取 $var, 当 len 为正整数,截取长度不超过 len;当 len 为负数,截取到倒数第 len 个字符。
var=abcdef
echo ${var:1:1} # b
echo ${var:1:6} # bcdef
echo ${var:1:7} # bcdef
echo ${var:1:-1} # bcde
echo ${var:3:-3} # 空
echo ${var:4:-3} # substring expression: 3 < 4 错误
echo ${var:-1:1} # abcdef, 当 pos 为负数,直接返回 $var
echo ${var:-1:-1} # abcdef
${var/Pattern/Replacement}
从 $var 中将匹配 Pattern 的部分替换为 Replacement
var=aaabcdef
echo ${var/a/A} # Aaabcdef
echo ${var/a*e/A} # Af
${var//Pattern/Replacement}
${var//Pattern/Replacement}与 ${var/Pattern/Replacement}不同之处在于:${var//Pattern/Replacement}进行的是全局匹配,${var/Pattern/Replacement}只匹配首次
var1=aaabcdef
echo ${var1/a/A} # AAAbcdef
var2=abcab
echo ${var2/ab/AB} # ABcAB
${var/#Pattern/Replacement}
${var/#Pattern/Replacement}与 ${var/Pattern/Replacement}不同之处在于:${var/#Pattern/Replacement}限制从头部开始匹配
var=abcab
echo ${var/#ab/AB} # ABcab
echo ${var/ab/AB} # ABcab
echo ${var/#bc/BC} # abcab
echo ${var/bc/BC} # aBCab
${var/%Pattern/Replacement}
${var/%Pattern/Replacement}与 ${var/Pattern/Replacement}不同之处在于:${var/%Pattern/Replacement}限制从尾部开始匹配
var=abcab
echo ${var/#ab/AB} # abcAB
echo ${var/ab/AB} # ABcab
echo ${var/#bc/BC} # abcab
echo ${var/bc/BC} # aBCab
${!varprefix*}, ${!varprefix@}
查找以 varprefix 开头的变量名
var1=1
var2=2
myvar=3
echo ${!var*} # var1 var2
echo ${!var@} # var1 var2