基本扩展
1 | $ val=test |
${val}
的形式可以明确界定变量名范围,比如上例用于拼接字符串。
空变量的扩展
${val1:-val2}
,当val1
未定义或为空时,将其扩展为val2
的值,但并不改变val1
;若val1
已定义且非空,则扩展为val1
的值。
1 | $ echo $val1 #val1未定义 |
${val1:=val2}
,当val1
未定义或为空时,将其扩展为val2
的值,并且将val2
的值赋给val1
;若val1
已定义且非空,则扩展为val1
的值。
1 | $ echo $val1 #val1未定义 |
注意:这种方式不能给位置参数以及其他特殊参数赋值
${val1:?val2}
,当val1
未定义或为空时,将val2
的值输出到标准错误;若val1
已定义且非空,则扩展为val1
的值。
1 | $ echo ${val1:?"val1 is empty"} |
${val1:+val2}
,当val1
未定义或为空时,不进行扩展;若val1
已定义且非空,则将其扩展为val2
的值,并且不改变val1
。
1 | $ echo $val1 |
返回变量名扩展
${!word*}
与${!word@}
,这两种形式的作用相同,返回以word
为开头的所有变量名。
1 | $ echo ${!val*} |
更多字符串扩展
1 | # ${#str},其作用是扩展为`str`变量包含的字符串长度。 |
${str:offset:length}
,其作用为,从索引offset
处开始截取str
,截取长度为length
,如过没有设置length
,则一直截取到末尾。
如果offset
为负数,则从字符串末尾倒数offset
开始进行截取,并且在offset
前必须添加一个空格,否则会被混淆为${str:-"val"}
这种扩展形式。
1 | $ str="test string" |
如果参数是@
,扩展的结果是从offset
开始,length
为位置参数。
${str#pattern}
与${str##pattern}
,作用为从字符串开头开始去除字符串str
中满足模式pattern
的部分,这两种方式的区别是#
去除最短匹配,而##
去除最长匹配。
1 | $ str="test.tar.gz" |
${str%pattern}
与${str%%pattern}
,作用为从字符串末尾开始去除字符串str
中满足模式pattern
的部分,这两种方式的区别是%
去除最短匹配,而%%
去除最长匹配。
1 | $ str="test.tar.gz" |
${str/pattern/replace}
,其作用为将字符串str
中第一个符合pattern
模式匹配的部分替换为replace
。
1 | $ str="test.txt.txt" |
${str//pattern/replace}
,其作用为将字符串str
中所有符合pattern
模式匹配的部分替换为replace
。
1 | $ echo ${str//txt/suffix} |
${str/#pattern/replace}
,/#
的形式要求匹配出现在字符串开头。
1 | $ echo ${str/#txt/suffix} |
${str/%pattern/replace}
,/%
的形式要求匹配出现在字符串末尾。
1 | $ echo ${str/%test/new-name} |
如果不设置replace
,这四种形式的扩展将去掉满足匹配模式pattern
的部分。
数值的扩展
数值计算的扩展使用$(())
或$[]
。
1 | $ echo $((1+2*3)) |
进制转换
1 | $ echo $((2#1111)) |