Linux Shell參数扩展(Parameter Expansion)

Posted llguanli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux Shell參数扩展(Parameter Expansion)相关的知识,希望对你有一定的参考价值。

本文主要參考:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02

其它资料:http://www.ibm.com/developerworks/cn/linux/l-bash-parameters.html


參数扩展的表示形式为:${expression}。

expression包含各种字符直到匹配上‘}‘。当出现下面情况时候‘}‘不会被检查来匹配:

1)在转义字符\之后,如\{;

2)在引號里面,如‘}’;

3)?在算术表达式,命令替换或者变量扩展里面的。如${value}


最简单的參数扩展形式如:${parameter}

使用例如以下模式能够改动參数扩展:

${parameter:-[word]}Use Default Values. If?parameter?is unset or null, the expansion of?word?(or an empty string if?word?is omitted) shall be substituted; otherwise, the value of?parameter?shall be substituted.当${parameter}值为空或者没有设定的时候,用[word]值来替换。否则它就是该表达式的值。
[[email protected] ~]$ bb=3
[[email protected] ~]$ echo ${aa}

[[email protected] ~]$ echo ${bb}
3
[[email protected] ~]$ echo ${aa-${bb}}
3
[[email protected] ~]$ aa=2
[[email protected] ~]$ echo ${aa-${bb}}
2
${parameter:=[word]}Assign Default Values. If?parameter?is unset or null, the expansion of?word?(or an empty string if?word?is omitted) shall be assigned to?parameter. In all cases, the final value of?parameter?shall be substituted. Only variables, not positional parameters or special parameters, can be assigned in this way.当${parameter}值为空或者没有设定的时候。用[word]值来给${parameter}赋值并替换最后的表达式。否则它就是该表达式的值。


[[email protected] ~]$ echo ${aa-${bb}}
2
[[email protected] ~]$ echo ${aa:=${bb}}
2
[[email protected] ~]$ echo ${cc}

[[email protected] ~]$ echo ${cc:=${bb}}
3
[[email protected] ~]$ echo ${cc}
3
${parameter:?

[word]}Indicate Error if Null or Unset. If?parameter?is unset or null, the expansion of?word?(or a message indicating it is unset if?word?is omitted) shall be written to standard error and the shell exits with a non-zero exit status. Otherwise, the value of?parameter?shall be substituted. An interactive shell need not exit.当${parameter}值为空或者没有设定的时候,用[word]值作为标准错误输出提示并退出shell且返回非0状态。

则它就是该表达式的值。

[[email protected] ~]$ echo ${cc:?"Value not set"}
3
[[email protected] ~]$ echo ${dd:?

"Value not set"} -bash: dd: Value not set

${parameter:+[word]}Use Alternative Value. If?parameter?is unset or null, null shall be substituted; otherwise, the expansion of?word?(or an empty string if?word?is omitted) shall be substituted.当${parameter}值为空或者没有设定的时候,表达式返回null。否则用[word]替换表达式的值。


[[email protected] ~]$ echo ${cc:+"Value not set"}
Value not set
[[email protected] ~]$ echo ${dd:+"Value not set"}

${#parameter}

String Length. The length in characters of the value of?parameter?shall be substituted. If?parameter?is?‘*‘?or?‘@‘, the result of the expansion is unspecified. If?parameter?is unset and?set?-u?is in effect, the expansion shall fail.表达式返回${parameter}值中字符的个数。

[[email protected] ~]$ echo ${#cc}
1
[[email protected] ~]$ echo ${#dd}
0

The following four varieties of parameter expansion provide for substring processing. In each case, pattern matching notation (see?Pattern Matching Notation), rather than regular expression notation, shall be used to evaluate the patterns. If?parameter?is?‘#‘,?‘*‘, or?‘@‘, the result of the expansion is unspecified. If?parameter?is unset and?set?-u?is in effect, the expansion shall fail. Enclosing the full parameter expansion string in double-quotes shall not cause the following four varieties of pattern characters to be quoted, whereas quoting characters within the braces shall have this effect. In each variety, if?word?is omitted, the empty pattern shall be used.

${parameter%[word]}

Remove Smallest Suffix Pattern. The?word?shall be expanded to produce a pattern. The parameter expansion shall then result in?parameter, with the smallest portion of the suffix matched by the?pattern?deleted. If present,word?shall not begin with an unquoted?‘%‘.
用[word]产生的模式来匹配${parameter}的后缀并去除掉最小匹配部分
[[email protected] ~]$ echo ${cc}
Value not set
[[email protected] ~]$ echo ${cc%"et"}
Value not s
${parameter%%[word]}Remove Largest Suffix Pattern. The?word?shall be expanded to produce a pattern. The parameter expansion shall then result in?parameter, with the largest portion of the suffix matched by the?pattern?deleted.用[word]产生的模式来匹配${parameter}的后缀并去除掉最大匹配部分
[[email protected] ~]$ echo ${cc%%t*}
Value no
[[email protected] ~]$ echo ${cc%t*}
Value not se
${parameter#[word]}Remove Smallest Prefix Pattern. The?word?shall be expanded to produce a pattern. The parameter expansion shall then result in?parameter, with the smallest portion of the prefix matched by the?pattern?deleted. If present,?word?shall not begin with an unquoted?‘#‘.${parameter##[word]}Remove Largest Prefix Pattern. The?word?shall be expanded to produce a pattern. The parameter expansion shall then result in?parameter, with the largest portion of the prefix matched by the?pattern?deleted.最后两个各自是去除掉前缀的[word]最小匹配和最大匹配
[[email protected] ~]$ echo ${cc#*t}
set
[[email protected] ~]$ echo ${cc##*t}

[[email protected] ~]$ echo ${cc#V}
alue not set



以上是关于Linux Shell參数扩展(Parameter Expansion)的主要内容,如果未能解决你的问题,请参考以下文章

Linux Bash Shell学习笔记

Shell parameter expansion

Template template parameter(模板參数) example

linux shell 变量子串

shell 变量替换

Linux Shell 使用手记