在Linux /etc/init.d/functions
脚本中,我发现了下面的参数扩展,我不太明白:
${p//[0-9]/} replace all instances of any number to/by what? ${1##[-+]} This seems to remove all the longest left instances of minuses and pluses? ${LSB:-} This seems to say that if LSB is not set then set nothing? in other words do nothing?
这些是bash
Shell参数扩展的实例; 请参阅http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
注意: ksh
和zsh
支持你的问题中的扩展(我在功能上的重叠程度还不清楚),而sh
(POSIX-features-only shells)不支持字符串替换扩展, ${p//[0-9]/}
。
${p//[0-9]/}
删除所有数字 :用空字符串替换数字( [0-9]
)的所有(/)实例 – 即删除所有数字(最后一个字符是替换字符串,在这种情况下为空) 。
${1##[-+]}
删除单个前导-
或+
(如果存在) :从技术上讲,这会从参数$1
删除由单个或+
字符组成的最长前缀( ##
)。 由于搜索模式只匹配一个字符,因此不需要在这里使用##
作为最长的前缀,而使用#
– 作为最短的前缀。
${LSB:-}
设计一个no-op来防止脚本在使用-u
(数据nounset
)shell属性运行时nounset
:从技术上讲,这种扩展意味着:如果变量$LSB
没有被设置或为空 ,则被替换为跟在后面的字符串:-
,在这种情况下,它也是空的。
乍看起来,这似乎毫无意义,但Sigi指出:
“
如果使用-u
选项(或使用set -u
)调用shell,并且变量$LSB
实际上可能未被设置,则${LSB:-}
构造非常有意义。 然后,如果您将$LSB
作为${LSB:-}
引用,则可以避免shell溢出。 由于在复杂脚本中使用set -u
是一种很好的做法,所以这个举动经常会派上用场。
“
${p//[0-9]/} # removes digits from anywhere in `$p` ${1##[-+]} # removes + or - from start in $1 ${LSB:-} # not really doing anything