【问题标题】:why do I get an error 'invalid arithmetic operator'?为什么我会收到错误“无效的算术运算符”?
【发布时间】:2016-11-13 04:46:22
【问题描述】:

我正在尝试将 yaml 解析为 Json。 我想设置具有字符串索引的数组。

当我尝试它时,我得到了一个错误

这是我的来源和错误

keys=$(echo $ci_json | jq 'keys')
key_array=($keys)
ARR=()

for raw_key in ${key_array[@]}; do
        if [ $raw_key = '[' -o $raw_key = ']' ]; then
                continue;
        else
                key=$(echo $raw_key | sed -e 's/"//g' -e 's/,//g')
                value=$(echo $ci_json | jq .$key)$'\t'
                ARR[$key]=$value
        fi
done

错误:localhost.localdomain:语法错误:算术运算符无效(错误标记为“.localdomain”)

此错误出现在“ARR[$key]=$value”

有人帮助我吗?

这是关键清单:

APP_TYPE APP_USE 资产_NO 资产状态 资产类型 BIZ_GROUP BIZ_L1 BIZ_L2 CI_COMMENT CI_NO CI_OWNER CI_PARENT CPU_CLOCK CPU_CORE CPU_型号 CPU_NUM CPU_供应商 DB_ADMIN1 DB_ADMIN2 DEV_ADMIN DEV_ADMIN2 DISUSE_DATE ENTER_DATE 到期日期 硬盘型号 硬盘_NUM 硬盘类型 HDD_VENDOR HDD_VOL HOLE_NO 主机名 国际数据中心 INTO_DATE MAINT_CORP MAINT_DATE MEM_MODEL MEM_NUM MEM_VENDOR MEM_VOL 模型 网卡1_IP 网卡1_MAC NIC1_PORT 网卡1_SW 网卡2_IP NIC2_MAC NIC2_PORT NIC2_SW 网卡模型 NIC_VENDOR OOB_IP OOB_MAC OOB_PORT OOB_SW OS_ARCH OS_KERNEL OS_NAME 架子 RACK_NO RAID_CACHE RAID_FIRM RAID_MODEL RAID_NO RAID_VENDOR 代表 SC_ADMIN SC_CATEGORY SC_DEPT SC_TYPE SEND_DATE 序列号 SERVER_CLASS SIM卡 SPEC_CODE SVC_GROUP SVC_L1 SVC_L2 SYS_ADMIN SYS_ADMIN2 单元 USE_DESC 小贩 VM_CLASS VM_TYPE 分配类型

【问题讨论】:

  • 你到底想做什么?您提到解析 YAML 以生成等效的 JSON,但您使用 jq 来解析输入。你的输入是什么样的,预期的输出是什么? bash 实际接触任何数据的次数越少,您的代码就越有可能不会因有效输入而中断。
  • 我要做的是发送协议并获取 YAML 数据,然后将 YAML 更改为 JSON,因为我认为 JSON 比 YAML 更容易解析。这就是我使用 jq 的原因。我可以将 YAML 更改为 JSON,并且我想设置具有字符串索引并具有来自 JSON 的数据的数组。我希望我可以设置像“ARR[$key]=$value”这样的数组,但是当我尝试它时,会发生错误。对不起我英语不好..

标签: bash shell


【解决方案1】:
 Error : localhost.localdomain: syntax error: invalid arithmetic operator (error token is ".localdomain")

ARR 是索引数组(非关联数组)并且key 的值为localhost.localdomain 时,ARR[$key]=... 会发生这种情况。 索引数组应该使用数字下标,而不是任意字符串。

如果你想在ARR 中使用字符串索引, 您必须将其声明为关联数组, 从 Bash 4 开始支持:

declare -A ARR

【讨论】:

  • 但是没有像localhost.localdomain这样的键!这就是让我发疯的原因
  • 您的计算机不同意您的意见。在ARR[$key]=... 行之前添加echo $key 语句。您会看到您确实拥有这样的密钥,这可能是由于您(显然)没有预料到的另一个错误。
  • 如果我找不到任何类似的钥匙怎么办,我可以尝试什么
  • 我不明白你的问题。从错误消息中可以明显看出您拥有这样的密钥。查看echo $ci_json | jq 'keys' | grep localhost 的输出。不知道您还需要什么帮助。
  • 我会再试一试,无论如何,谢谢
【解决方案2】:

如果您想使用非数字键,请使用关联数组而不是普通数组。不过,你必须声明它,所以替换

ARR=()

declare -A ARR

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2019-04-16
    • 1970-01-01
    • 2017-11-30
    • 2021-12-07
    相关资源
    最近更新 更多