猫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函数?
使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] 举报,一经查实,本站将立刻删除。