【问题标题】:Why does ${##parameter} always return 0?为什么 ${##parameter} 总是返回 0?
【发布时间】:2020-05-25 01:21:22
【问题描述】:

假设parameter=value 是bash 中的一个内部变量。 当我在 bash 中尝试${#parameter} 时,它返回一个5。但是,例如,当我尝试${##parameter}${###parameter} 时,它总是回馈0 作为回报。 为什么它不像其他情况那样说它是替换错误?

【问题讨论】:

  • 它并不总是返回0,它返回$#的值。在这种情况下,变量的值显然是 0。

标签: bash shell parameter-expansion


【解决方案1】:

因为## 是一个特殊的去除前缀的运算符。例如,请参见此处:What is the meaning of the ${0##...} syntax with variable, braces and hash character in bash?

【讨论】:

  • 但是,如果它删除一个前缀,这个语法echo ${##param}(假设参数是未绑定的)应该什么都不打印,但它会打印 0。
  • 它不适用于param 它适用于$# 并尝试剥离"param" 因此它不会尝试扩展(访问)名称为param 的变量或@987654327 后面的任何内容@/##.
【解决方案2】:

短版

您可以将${##parameter} 表示为:

x=$#
${x#parameter}

${###parameter} 为:

x=$#
${x##parameter}

您正在对$#(传递给脚本/函数的参数数量)执行前缀删除。


加长版

如果parameter 有任何特殊含义,它很可能特定于您的环境。

$ echo \""${parameter}"\"
""

甚至:

$ set -u
$ echo \""${parameter}"\"
bash: parameter: unbound variable

现在解决这个问题,快速查看docs

${#parameter}

替换参数扩展值的字符长度。

所以没有设置变量parameter

$ echo ${#parameter}
0

set -u:

$ echo ${#parameter}
bash: parameter: unbound variable

Additional # 将含义更改为 删除匹配的前缀模式。 使用:${parameter#word}${parameter##word} ${#} 上的语法,即传递给脚本/函数的参数数量。查看和理解这种行为的好方法是:

$ f() { echo -n "$# " ; echo ${##parameter}; }
$ f
0 0
$ f a b c
3 3

正如您在第一次调用中看到的 ${#}0 并且(并且尝试去除前缀 "parameter" 并没有真正起到作用)并且 ${#} 的第二次调用值是 3

前缀去除,### 之间的区别在于,在匹配模式时,无论是短匹配还是最长匹配都会被去除。

【讨论】:

  • 为了进一步强调# 的含义如何依赖于上下文,${####param} 将被解析为尝试从值中去除匹配#param 的最长前缀(带有##$#.
  • 好吧,底线确实是,因为$# 将是一个十进制数字表示,任何someString 前缀的删除本质上是nop。 ;)
  • 对;我只是指出# 可以用作参数名称、扩展运算符(的一部分)以及该运算符的部分参数都在同一个表达式中(无论操作是否对值做任何事情) .
猜你喜欢
  • 2021-01-24
  • 2016-09-16
  • 2013-02-26
  • 2013-06-25
  • 1970-01-01
  • 2013-02-14
  • 2011-12-13
  • 2011-06-28
相关资源
最近更新 更多