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##... 语法是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章