【问题标题】: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}

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

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

【问题讨论】:

    标签: bash variables syntax curly-braces


    【解决方案1】:

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

    【讨论】:

    【解决方案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 只是一个模式。

    【讨论】:

    猜你喜欢
    • 2013-05-28
    • 2013-08-27
    • 2019-01-20
    • 2021-03-17
    • 1970-01-01
    • 2019-06-16
    • 2012-03-22
    • 1970-01-01
    相关资源
    最近更新 更多