bash 中带有变量、大括号和哈希字符的 $0##... 语法是啥意思?

Posted

技术标签:

【中文标题】bash 中带有变量、大括号和哈希字符的 $0##... 语法是啥意思?【英文标题】:What is the meaning of the $0##... syntax with variable, braces and hash character in bash?bash 中带有变量、大括号和哈希字符的 $0##... 语法是什么意思? 【发布时间】:2011-01-04 19:29:17 【问题描述】:

我刚刚在 bash 中看到了一些我不太理解的代码。作为新手 bash 脚本编写者,我不确定发生了什么。

echo $0##/*
echo $0

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

谁能给我一些关于这个语法的见解?

【问题讨论】:

【参考方案1】:

请参阅 bash(1) 手册页的 Parameter Expansion 部分。

【讨论】:

shellscript.sh/tips/pattern-substitution - 参数替换的另一个很好的参考【参考方案2】:

Linux tip: Bash parameters and parameter expansions

$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

【讨论】:

对像我这样的初学者的一些解释会更好,比如这些模式是如何工作的【参考方案3】:

请参阅高级 Bash 脚本指南中关于 Substring removal 的部分‡:

$string#substring

$string 前面删除substring 的最短匹配项。

$string##substring

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

子字符串可能包含通配符*,匹配所有内容。表达式$0##/* 打印$0 的值,除非它以正斜杠开头,在这种情况下它什么也不打印。

‡ 截至 2019 年 3 月 7 日,该指南错误地声称匹配是 $substring,好像 substring 是一个变量的名称。不是:substring 只是一个模式。

【讨论】:

您介意在 Bash 参考手册中添加指向相关部分的链接吗?例如gnu.org/software/bash/manual/…

以上是关于bash 中带有变量、大括号和哈希字符的 $0##... 语法是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

bash 函数:将主体括在大括号与括号中

Bash 中带有字符、点和数字的正则表达式

匹配单词忽略sed中带有额外字符的相同单词

读取bash脚本中的输入,该脚本是路径中带有空格的目录[重复]

Bash Shell中的通配符及转义字符的使用

PowerShell 中带括号的环境变量名称,如 %ProgramFiles(x86)%?