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