在bash shell脚本中##或//是什么意思?

时间:2017-03-18 00:14:17

标签: bash shell

我搜索了很多,虽然我看到了几个这样的例子,特别是from here

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

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

2 个答案:

答案 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。