我遇到了一个看似非常简单的问题,我似乎无法解决,我从 bash 得到的唯一帮助是这是一个糟糕的替换。有什么帮助吗?
#!/bin/bash
lang=Python
frameworks=('Python=(Django Flask Pyramid)' 'Ruby=(Rails Cuba)')
for i in "${frameworks[@]}";do eval $i;done
echo "Python ${#$lang[@]} ${$lang[@]}"
echo "Ruby ${#Ruby[@]} ${Ruby[@]}"
上面的第 5 行是抛出错误的原因,但第 6 行工作正常,哪个应该做同样的事情?
输出:
>>>line 5: Python ${#$lang[@]} ${$lang[@]}: bad substitution
>>>Ruby 2 Rails Cuba
你不能以这种方式使用$lang
(显然)。bash数组构造${name[@]}
有点神圣。如果你想以这种方式尊重$lang
,你需要另一个eval
。
试试这个:
eval "echo "Python ${#$lang[@]} ${$lang[@]}""
使用间接寻址。将要扩展的内容分配给变量(在本例中为 Python[@]
),然后使用 ${!thatvariable}
:
mything="$lang[@]"
echo "${!mything}"