微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

shell中的“无效算术运算符”

猫test.sh

#!/bin/bash key="index"; arr[$key]="val" echo ${arr[${key}]}

/ bin / bash-x test.sh

+ key=index + arr[$key]=val + echo val val

那我修改test.sh:

#!/bin/bash key="index.index"; arr[$key]="val" echo ${arr[${key}]}

/ bin / bash -x test.sh

按另一列的值计算一个列组的值的数量

Bash脚本改变curl括号样式

猫通过subprocess.Popen()调用时阻塞

Bash输出限制

在java程序的不同目录中运行Bash命令

+ key=index.index + arr[$key]=val test.sh: line 3: index.index: Syntax error: invalid arithmetic operator (error token is ".index") test.sh: line 4: index.index: Syntax error: invalid arithmetic operator (error token is ".index")

为什么这个错误出现,任何build议将不胜感激!

用日志中的主机名replaceIP

如何在shell中运行C函数

如何输出awk结果到文件

使linux“等待”命令等待所有subprocess

Bash:将来自多个并发命令的stdout分解成列

使用declare -A arr声明数组变量为关联数组。

$ cat test.sh #!/bin/bash set -x declare -A arr key="index.index"; arr["$key"]="val" echo "${arr["${key}"]}" $ ./test.sh + declare -A arr + key=index.index + arr["$key"]=val + echo val val

这个:

key="index"; arr[$key]="val" echo ${arr[${key}]}

显示工作。 由于arr是一个普通的数组,而不是一个关联数组,它只能被非负整数值索引。

考虑这个有效的代码

index=42 key="index" arr[$key]="val" echo ${arr[42]} echo ${arr[index]} echo ${arr[$index]} echo ${arr['index']} echo ${arr["index"]} echo ${arr[index]}

所有的echo语句打印val 。 由于索引被视为一个算术表达式,它可以引用一个变量(在这种情况下, $index ),无论是否有$前缀 – 即使它是一个带引号的字符串。

在你的代码中,你从来没有给$index赋值, ${arr[${key}]}扩展为${arr[index]} ,相当于${arr[$index]} , (认)等同于${arr[0]} 。

(如果已经set -o nounset ,则对未设置变量的引用将被视为错误,并且您的代码生成错误消息。)

你的第二块代码

key="index.index"; arr[$key]="val" echo ${arr[${key}]}

是无效的,因为index.index不是一个有效的变量名 – 即使你可能意味着它只是一个用作数组索引的字符串。

如果你想让arr允许任意字符串作为索引,它需要是一个关联数组 。 您可以简单地通过分配给它(或通过使用declare -a )来创建一个非关联数组,但是只能使用declare -A创建一个关联数组。

关联数组在第4版中添加到了bash中。如果您使用的是早期版本的bash,则不支持declare -A 。 您需要升级到更新的bash,编写一些笨拙的替代方案,或者使用支持关联数组的语言,如Awk,Python或Perl。

添加declare -A arr (如user000001的答案所示)应该可以解决问题(如果你有bash 4),但是理解你原来的代码实际上在做什么(或者不做)是有益的 。

(顺便说一句,谢谢你问这个问题,我在写这个答案的时候学到了很多东西。)

此行为因BASH版本而异。 较早的BASH版本只允许非负整数作为数组中的键。

请注意,BASH中的变量名称中不允许使用dot/period 。

有关BASH中允许的字符的更多详细信息,请参阅此Q&A: Linux环境变量名称中允许的字符

编辑:

(非常感谢@chepner的这个附录)

规则数组(不是关联数组)只能用整数索引。 用作方括号之间的索引的任何表达式都被视为一个算术表达式。 $ key扩展为index,然后将其视为一个扩展为0的(unset)变量。如果您将一个值指定为3,那么${array[$key]} -> ${array[index]} -> ${array[3]} 。 这是一种隐式间接参数扩展

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐