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