我有一个点文件名与 ids 的关联数组,看起来完全像这样:
declare -A ids=(
[".steve"]="1 4 5 6 10"
[".john"]="3 4 5 1 11"
...
)
当我运行此代码时,我得到:
./declare_ids.sh: line 23: .steve: operand expected (error token is ".steve")
这个错误看起来真的非常模糊。我不明白发生了什么事。我对 bash 很陌生,刚刚学习 bash v4 中的关联数组。有人可以帮忙吗?
编辑:
此脚本中的 shebang 行是 #!/bin/bash
。我正在 zsh
内运行它OS X 上的终端,我通过 brew install bash
安装了 bash .
bash --version
说:
GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin15.6.0) │
Copyright (C) 2016 Free Software Foundation, Inc. │
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> │
│
This is free software; you are free to change and redistribute it. │
There is NO WARRANTY, to the extent permitted by law.
当我输入 bash --version
时也是如此紧接在 declare -A
之前线。
和which bash
返回/usr/local/bin/bash
。只需输入 ./declare_ids.sh
即可在终端内调用该脚本。 .
再次编辑:
正如已经说过的,呼应 $BASH_VERSION
与 bash --version
不同。 $BASH_VERSION
是 3.2.57(1)-版本。
有没有办法让/bin/bash升级?我也在 ubuntu CircleCI 盒子上使用这个脚本,所以任何硬编码到什么 brew
确实会很糟糕。
最佳答案
最可能的解释是您的 bash 版本太旧,无法实现关联数组,例如,如果您使用 OS X 的默认版本,则可能会出现这种情况。
通过输入以下命令获取正在运行的 bash 的最终版本:
echo $BASH_VERSION
紧接在声明-A
之前。 (您还可以使用命令 /path/to/bash --version
,其中 /path/to/bash
是 shebang 行中的完整路径;在本例中/bin/bash
)
确实,错误消息不太容易解释,但是旧版本需要时间旅行才能告诉您正在使用尚未添加到 shell 中的语法。该错误来自于 declare
内置函数将带括号的参数解释为索引数组,如果它看到 var=(
,即使没有 ,它也会自动执行此操作-a
选项。在索引数组中,下标必须是数字(bash 术语中的整数),并且 [.steve]
不是数字。(引号不相关;[ "3"]
可以正常工作,因为 bash 允许您在数字表达式中引用数字。奇怪的是,[steve]
也可以正常工作,因为在数字表达式中,变量名不是定义的变量被视为 0。)
关于arrays - bash 关联数组需要语法错误操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43948064/