假设parameter=value是bash中的一个内部变量。当我在bash中尝试${#parameter}时,它返回一个5。但当我尝试使用${##parameter}或${###parameter}时,它总是返回0作为回报。为什么它不像在其他情况下那样说这是一个替换错误?
发布于 2020-02-09 23:56:13
简短版本
您可以将${##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附加#更改了删除匹配前缀模式的含义。在${#}上使用:${parameter#word}或${parameter##word}语法,即传递给脚本/函数的参数数量。查看和理解这种行为的好方法是:
$ f() { echo -n "$# " ; echo ${##parameter}; }
$ f
0 0
$ f a b c
3 3正如您在第一个调用中看到的,${#}是0和(并且尝试剥离前缀"parameter"实际上对它没有任何影响),而${#}的第二个调用值为3。
前缀去除,#和##之间的区别是,当匹配模式时,无论是短匹配还是最长匹配都会被剥离。
发布于 2020-02-09 23:52:04
因为##是一个删除前缀的特殊运算符。例如,请参阅此处:What is the meaning of the ${0##...} syntax with variable, braces and hash character in bash?
https://stackoverflow.com/questions/60138289
复制相似问题