在bash中带有变量,大括号和哈希字符的$ {0 ## ...}语法是什么意思?

use*_*997 38 variables syntax bash curly-braces

我刚看到bash中的一些代码,我不太明白.作为新手bash脚本,我不知道发生了什么.

echo ${0##/*}
echo ${0}
Run Code Online (Sandbox Code Playgroud)

我没有看到这两个命令的输出有什么不同(打印脚本名称).这#只是一个评论吗?什么是/*.如果是评论,为什么它不会干扰关闭}括号?

谁能让我对这种语法有所了解?

Mar*_*ers 52

请参阅" 高级Bash脚本指南"中有关删除子字符串的部分:

${string#substring}
Run Code Online (Sandbox Code Playgroud)

删除substring$ string前面的最长匹配.

*是一个通配符,匹配所有内容.该命令$string打印值,substring除非它以正斜杠开头,在这种情况下它不打印任何内容.

  • 正如脚注和之前的评论所暗示的那样,ABS 并不是一个很好的规范参考;这个答案可以通过引用权威的或至少受人尊敬的来源来改进。 (2认同)

Pau*_*sey 24

Linux技巧:Bash参数和参数扩展

${PARAMETER##WORD}  Results in removal of the longest matching pattern from the beginning rather than the shortest.
for example
[ian@pinguino ~]$ x="a1 b1 c2 d2"
[ian@pinguino ~]$ echo ${x#*1}
b1 c2 d2
[ian@pinguino ~]$ echo ${x##*1}
c2 d2
[ian@pinguino ~]$ echo ${x%1*}
a1 b
[ian@pinguino ~]$ echo ${x%%1*}
a
[ian@pinguino ~]$ echo ${x/1/3}
a3 b1 c2 d2
[ian@pinguino ~]$ echo ${x//1/3}
a3 b3 c2 d2
[ian@pinguino ~]$ echo ${x//?1/z3}
z3 z3 c2 d2
Run Code Online (Sandbox Code Playgroud)


小智 5

我认为现有的答案(虽然肯定是准确的)忽略了OP问题的实际主旨。

OP 询问:

echo ${0##/*}
Run Code Online (Sandbox Code Playgroud)

我的猜测是他们在代码中真正看到的是:

echo ${0##*/}
Run Code Online (Sandbox Code Playgroud)

后者本质上意味着“删除最后一个斜杠(如果有)之前的所有内容”。因此,这是一种获取脚本名称而无需路径的简洁方法,无论脚本是如何调用的。它相当于*

basename "$0"
Run Code Online (Sandbox Code Playgroud)

但如果您将其用作变量而不是仅仅将其打印到控制台,则可以说更方便(并且更有效)。(OTOH 基本名称更具可移植性,而参数扩展则是一种破坏。)

* 或多或少。在某些边缘情况(例如以空格开头的文件名)中,它们不会输出完全相同的内容。