首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么${##parameter}总是返回0?

为什么${##parameter}总是返回0?
EN

Stack Overflow用户
提问于 2020-02-09 23:38:57
回答 2查看 110关注 0票数 2

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

EN

回答 2

Stack Overflow用户

发布于 2020-02-09 23:56:13

简短版本

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

代码语言:javascript
复制
x=$#
${x#parameter}

${###parameter}为:

代码语言:javascript
复制
x=$#
${x##parameter}

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

较长版本的

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

代码语言:javascript
复制
$ echo \""${parameter}"\"
""

或者甚至是:

代码语言:javascript
复制
$ set -u
$ echo \""${parameter}"\"
bash: parameter: unbound variable

现在,让我们快速了解一下docs

${#parameter}

替换参数扩展值的长度(以字符表示)。

所以在没有设置变量parameter的情况下:

代码语言:javascript
复制
$ echo ${#parameter}
0

或使用set -u

代码语言:javascript
复制
$ echo ${#parameter}
bash: parameter: unbound variable

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

代码语言:javascript
复制
$ f() { echo -n "$# " ; echo ${##parameter}; }
$ f
0 0
$ f a b c
3 3

正如您在第一个调用中看到的,${#}0和(并且尝试剥离前缀"parameter"实际上对它没有任何影响),而${#}的第二个调用值为3

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

票数 3
EN

Stack Overflow用户

发布于 2020-02-09 23:52:04

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60138289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档