我搜索了很多,虽然我看到了几个这样的例子,特别是from here:
scale=${scale##*[!0-9]*}
[ -z "${scale//[0-9]}" ]
没有解释这些符号的作用,它们如何工作或何时使用它们编写脚本。当讨论特殊符号时,我没有在其他地方找到它们。看起来它们可能很有用。任何人都可以解释##
和//
如何在上面链接的页面上的脚本示例中工作吗?感谢。
答案 0 :(得分:4)
它们是shell parameter expansion语法的一部分,用于修改变量的值。 #
和%
用于删除变量的前缀或后缀,//
用于将一个字符串替换为另一个字符串。
${parameter#word}
${parameter##word}
扩展该单词以生成模式,就像在文件名扩展中一样(请参阅文件名扩展)。如果模式匹配参数的扩展值的开头,则扩展的结果是具有最短匹配模式('#'大小写)或最长匹配模式('##'大小写)的参数的扩展值删除。
所以${scale##*[!0-9]*}
意味着删除匹配任何后跟非数字后跟任何内容的字符串的开头。因此,foobar
变为空字符串(因为所有内容都已删除),而123
则保持不变,因为[!0-9]
永远不会匹配任何内容。
${parameter/pattern/string}
扩展模式以生成与文件名扩展一样的模式。扩展参数,并将模式与其值的最长匹配替换为字符串。如果pattern以'/'开头,则pattern的所有匹配都将替换为string。通常只替换第一场比赛。如果pattern以'#'开头,则它必须在参数的扩展值的开头匹配。如果pattern以'%'开头,则它必须在参数的扩展值的末尾匹配。如果string为null,则删除pattern的匹配,并且可以省略/ following模式。
所以${scale//[0-9]}
只是从变量的值中删除所有数字,然后test -z
用于测试这是否为空字符串(意味着原始字符串只有数字)。
答案 1 :(得分:0)
来自:http://tldp.org/LDP/abs/html/string-manipulation.html
${string##substring}
从$ string前面删除$ substring的最长匹配。
${string//substring/replacement}
将$ substring的所有匹配替换为$ replacement。