You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash中使用eval为关联数组赋值失败,求解决方案

问题:BASH中构建关联列表时的语法错误

错误信息

  • BASH 4.4版本报错:

/tmp/foo.sh: line 18: 'key': syntax error: operand expected (error token is "'key'")

  • BASH 4.3版本报错:

/tmp/foo.sh: line 18: key: unbound variable

测试代码

#!/bin/bash
set -u

# 添加服务列表
add_list()
{
    local list="$1"

    eval "declare -a ${list}=(); declare -A ${list}_A=()"
}

# 向服务列表添加服务
add_service()
{
    local list="$1" def="$2"
    local s="${def%%:*}"

    eval "${list}+=('$def'); ${list}_A['$s']='$def'"
}

add_list TEST
add_service TEST 'key:value'

设计思路

使用两个数组的原因是既想通过键快速访问元素,又想保留元素的原始添加顺序(实际上${list}+=('$s')就足够实现顺序保留)。

bash -x调试输出

> bash -x /tmp/foo.sh 
+ set -u
+ add_list TEST
+ local list=TEST
+ eval 'declare -a TEST=(); declare -A TEST_A=()'
++ TEST=()
++ declare -a TEST
++ TEST_A=()
++ declare -A TEST_A
+ add_service TEST key:value
+ local list=TEST def=key:value
+ local s=key
+ eval 'TEST+=('\''key:value'\''); TEST_A['\''key'\'']='\''key:value'\'''
++ TEST+=('key:value')
++ TEST_A['key']=key:value
/tmp/foo.sh: line 18: 'key': syntax error: operand expected (error token is "'key'")

内容的提问来源于stack exchange,提问作者U. Windl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:55:17