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
相关产品推荐
相关产品推荐

