2

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

4

2 回答 2

3

精简版

你可以表达${##parameter}为:

x=$#
${x#parameter}

并且${###parameter}作为:

x=$#
${x##parameter}

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


更长的版本

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

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

甚至:

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

现在有了这个,快速查看文档

${#parameter}

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

parameter所以没有设置变量:

$ echo ${#parameter}
0

或与set -u

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

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

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

正如您在第一次调用${#}中看到的那样,0并且(并且尝试去除前缀"parameter"实际上对它没有任何作用)和第二次调用的值${#}is 3

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

于 2020-02-09T15:56:13.433 回答
0

因为## 是一个去除前缀的特殊运算符。例如,请参见此处:${0##...} 语法在 bash 中与变量、大括号和哈希字符的含义是什么?

于 2020-02-09T15:52:04.437 回答