2017-03-18 60 views
1

我寻觅了很多,而我看到一对夫妇使用的这些例子,具体from here##或//在bash shell脚本中的含义是什么?

scale=${scale##*[!0-9]*} 
[ -z "${scale//[0-9]}" ] 

没有解释什么,这些符号做什么,他们是如何工作的,或当使用这些脚本。在讨论特殊符号时,我没有在其他地方找到它们。看起来他们可能会有用。任何人都可以解释##//如何在上面链接的页面上的脚本示例中工作?谢谢。

+1

请发布您有问题的实际代码。 – Barmar

+0

http://tldp.org/LDP/abs/html/parameter-substitution.html –

回答

4

它们是shell的一部分parameter expansion语法,用于修改变量的值。 #%用于删除变量的前缀或后缀,而//用于替换另一个字符串。

${parameter#word}
${parameter##word}
word被扩展,以产生一个模式,就像在文件名扩展(见文件名扩展)。如果模式匹配参数展开值的开始位置,那么展开结果是最短匹配模式('#'情况)或最长匹配模式('##'情况)的参数展开值。删除。

所以${scale##*[!0-9]*}意味着删除字符串的开头,该字符串匹配任何后面跟非数字的字符后跟任何内容。所以foobar成为一个空字符串(因为一切都被删除),而123被留下,因为[!0-9]永远不会匹配任何东西。

${parameter/pattern/string}
图案被膨胀,以产生一个模式,就像在文件名扩展。参数被扩展并且模式与其值的最长匹配被字符串替换。如果模式以'/'开始,模式的所有匹配都被替换为字符串。通常只有第一场比赛被取代。如果模式以'#'开头,则它必须在参数的扩展值的开头匹配。如果模式以'%'开头,则它必须在参数的扩展值的末尾匹配。如果string为空,则删除pattern的匹配,并且可以省略/ following模式。

所以${scale//[0-9]}简单地移除从所述变量的值的所有数字,然后test -z用于测试,如果这是一个空字符串(这意味着原来的字符串只有数字)。