shell pattern(参数展开)

发布时间 2023-06-19 11:12:26作者: LiYanbin

shell pattern(参数展开)

 

${parameter:-word}

若 parameter 没有设置或为空,展开结果是 word 的值。若 parameter不为空,则展开结果是 parameter 的值

${parameter:=word}

若 parameter 没有设置或为空,展开结果是 word的值。另外,word的值会赋值给parameter。若parameter不为空,展开结果是 parameter的值。

 [me@linuxbox ~]$ foo=
[me@linuxbox ~]$ echo ${foo:="default value if unset"}
default value if unset
[me@linuxbox ~]$ echo $foo
default value if unset
[me@linuxbox ~]$ foo=bar
[me@linuxbox ~]$ echo ${foo:="default value if unset"}
bar
[me@linuxbox ~]$ echo $foo
bar
${parameter:?word} 若 parameter 没有设置或为空,这种展开导致脚本带有错误退出,并且 word 的内容会发送到标准错误。若 parameter 不为空,展开结果是 parameter 的值
${parameter:+word} 若 parameter 没有设置或为空,展开结果为空。若 parameter 不为空,展开结果是 word 的值会替换掉 parameter 的值;然而,parameter 的值不会改变
   
${#parameter} 展开成由 parameter 所包含的字符串的长度。通常,parameter 是一个字符串;然而,如果parameter 是 @ 或者是 * 的话,则展开结果是位置参数的个数。
${parameter:offset}
${parameter:offset:length}

这些展开用来从 parameter 所包含的字符串中提取一部分字符。提取的字符始于第 offset个字符(从字符串开头算起)直到字符串的末尾,除非指定提取的长度。
如果 parameter 是 @,展开结果是 length 个位置参数,从第 offset 个位置参数开始。

 
[me@linuxbox ~]$ foo="This string is long."
[me@linuxbox ~]$ echo ${foo:5}
string is long.
[me@linuxbox ~]$ echo ${foo:5:6}
string

若 offset 的值为负数,则认为 offset 值是从字符串的末尾开始算起,而不是从开头。注意负数前面必须有一个空格,为防止与 ${parameter:-word} 展开形式混淆。length,若出现,则必须不能小于零。

[me@linuxbox ~]$ foo="This string is long."
[me@linuxbox ~]$ echo ${foo: -5}
long.
[me@linuxbox ~]$ echo ${foo: -5:2}
lo
${parameter#pattern}
${parameter##pattern}

这些展开会从 paramter 所包含的字符串中清除开头一部分文本,这些字符要匹配定义的patten。pattern 是通配符模式,就如那些用在路径名展开中的模式。这两种形式的差异之处是: 该 # 形式清除最短的匹配结果,而该 ## 模式清除最长的匹配结果。

[me@linuxbox ~]$ foo=file.txt.zip
[me@linuxbox ~]$ echo ${foo#*.}
txt.zip
[me@linuxbox ~]$ echo ${foo##*.}
zip
${parameter%pattern}
${parameter%%pattern}

这些展开和上面的 # 和 ## 展开一样,除了它们清除的文本从 parameter 所包含字符串的末尾开始,而不是开头

[me@linuxbox ~]$ foo=file.txt.zip
[me@linuxbox ~]$ echo ${foo%.*}
file.txt
[me@linuxbox ~]$ echo ${foo%%.*}
file
${parameter/pattern/string}
${parameter//pattern/string}
${parameter/#pattern/string}
${parameter/%pattern/string}

这种形式的展开对 parameter 的内容执行查找和替换操作。如果找到了匹配通配符 pattern的文本,则用 string 的内容替换它。在正常形式下,只有第一个匹配项会被替换掉。在该// 形式下,所有的匹配项都会被替换掉。该/# 要求匹配项出现在字符串的开头,而/% 要求匹配项出现在字符串的末尾。/string 可能会省略掉,这样会导致删除匹配的文本

[me@linuxbox~]$ foo=JPG.JPG
[me@linuxbox ~]$ echo ${foo/JPG/jpg}
jpg.JPG
[me@linuxbox~]$ echo ${foo//JPG/jpg}
jpg.jpg
[me@linuxbox~]$ echo ${foo/#JPG/jpg}
jpg.JPG
[me@linuxbox~]$ echo ${foo/%JPG/jpg}
JPG.jpg