use*_*997 38 variables syntax bash curly-braces
我刚看到bash中的一些代码,我不太明白.作为新手bash脚本,我不知道发生了什么.
echo ${0##/*}
echo ${0}
Run Code Online (Sandbox Code Playgroud)
我没有看到这两个命令的输出有什么不同(打印脚本名称).这#只是一个评论吗?什么是/*.如果是评论,为什么它不会干扰关闭}括号?
谁能让我对这种语法有所了解?
Mar*_*ers 52
请参阅" 高级Bash脚本指南"中有关删除子字符串的部分:
Run Code Online (Sandbox Code Playgroud)${string#substring}删除
substring$ string前面的最长匹配.
*是一个通配符,匹配所有内容.该命令$string打印值,substring除非它以正斜杠开头,在这种情况下它不打印任何内容.
Pau*_*sey 24
${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 基本名称更具可移植性,而参数扩展则是一种破坏。)
* 或多或少。在某些边缘情况(例如以空格开头的文件名)中,它们不会输出完全相同的内容。