【问题标题】:Syntax error operand expected with bash associative array [duplicate]bash关联数组预期的语法错误操作数[重复]
【发布时间】:2017-10-12 09:12:14
【问题描述】:

我有一个与 id 完全一样的点文件名称关联数组:

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。我在 OS X 上的 zsh 终端内运行它,并通过 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_VERSIONbash --version 不同。 $BASH_VERSION 是 3.2.57(1)-release。

有没有办法让 /bin/bash 升级?我也在 ubuntu circleCI 盒子上使用这个脚本,所以任何硬编码为 brew 所做的事情都会很糟糕。

【问题讨论】:

  • 命令bash --version 启动一个新的bash 实例并返回其版本。要查找运行脚本的 bash 版本,请添加命令 echo $BASH_VERSION 并向我们显示结果。
  • 你的 she-bang 行说 /bin/bash。如果which bash 表示/usr/local/bin/bash,那么(可能)是不同的 bash 版本。
  • 您可以比较 /bin/bash --version(脚本运行的内容,可能是旧 Bash)和 /usr/local/bin/bash --version,可能是新 Bash。使用bash ./script 运行脚本使用新的 Bash,运行它./script 使用旧的 Bash。这是我的猜测。
  • @John1024 很棒,更新了我的回复。
  • 我投票决定将其作为副本关闭,但我在这里给出的答案丢失了,所以我在那里添加了它。

标签: arrays bash associative-array


【解决方案1】:

最可能的解释是您的 bash 版本太旧而无法实现关联数组,例如,如果您使用的是 OS X 的默认版本,可能就是这种情况。

通过输入以下命令获取正在运行的 bash 的最终版本:

echo $BASH_VERSION

紧接在declare -A 之前。 (您也可以使用命令/path/to/bash --version,其中/path/to/bash 是shebang 行中的完整路径;在本例中为/bin/bash

确实,错误消息不是很容易解释,但是旧版本需要时间旅行才能告诉您您正在使用尚未添加到 shell 的语法。该错误来自于内置的declare 将带括号的参数解释为索引数组,即使没有-a 选项,它也会在看到var=( 时自动执行此操作。在索引数组中,下标必须是数字(整数,在 bash 术语中)并且[.steve] 不是数字。 (引号无关紧要;["3"] 可以正常工作,因为 bash 允许您在数字表达式中引用数字。奇怪的是,[steve] 也可以正常工作,因为在数字表达式中,不是已定义变量的变量名被视为 0 .)

【讨论】:

  • 感谢您的回复。正如我上面所说,我正在运行 bash 版本 4、4.4.2,它支持关联数组。
  • @rec,您可能有一个 bash 版本 4,但该错误消息并非来自它。它来自版本 3。这意味着您还安装了版本 3。也许sh 被解析为版本3;也许你的she-bang系列有错误的路径。有关如何调用脚本的更多详细信息会有所帮助。
  • @rec:更新了一些关于如何验证正在为相关脚本运行的版本的建议。
  • 我按要求添加了更多详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2017-07-18
相关资源
最近更新 更多