我不明白这个参数的扩展:$ {p // /}

在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

注意: kshzsh支持你的问题中的扩展(我在功能上的重叠程度还不清楚),而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