基本扩展
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)) |