我不理解这个参数扩展:$ {p // [0-9] /}

时间:2014-04-27 04:34:18

标签: linux shell parameters expansion

在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?

2 个答案:

答案 0 :(得分:4)

这些是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:-} 

设计用于防止脚本在使用-unounset)shell属性运行时崩溃的无操作:从技术上讲,此扩展意味着:在大小写变量{ {1}} 未设置或为空,它将替换为$LSB后面的字符串,在这种情况下,该字符串也为空。

虽然乍一看这似乎毫无意义,但它有其目的,正如Sigi所指出的那样:

"
如果使用:-选项调用shell(或使用${LSB:-}),则-u构造非常有意义,并且实际上可能未设置变量set -u。如果您将$LSB引用为$LSB,则可以避免shell退出。由于在复杂的脚本中使用set ${LSB:-}是一种很好的做法,因此这一举措经常派上用场。
"

答案 1 :(得分:0)

${p//[0-9]/} # removes digits from anywhere in `$p`

${1##[-+]} # removes + or - from start in $1

${LSB:-} # not really doing anything