BASH将数组元素更改为变量

时间:2013-11-06 17:57:15

标签: arrays bash variables

我正在尝试从数组元素创建变量,并在源文件中检查我创建的变量的值。

MySourceFile:

value1abc="10"
value2efg="30"
value3ade="50"
value4tew="something else"
onemorevalue="192.168.1.0"

脚本代码:

declare -a CfgData
CfgData=("value1abc" "value2efg" "value3ade" "value4tew" "othervalue" "onemorevalue")
COUNTER="0"

source MySourceFile

until [ $COUNTER == ${#CfgData[@]}  ]; do
    value=$[${CfgData[$COUNTER]}]
    echo -ne "\\n${CfgData[$COUNTER]}=\"$value\""\\n\\n
    let COUNTER+=1
done

脚本工作正常,直到包含除纯数字(字母,空格,点,通常所有字符)之外的数据的值,在这种情况下:

value="randomcharacters" # Gives me "0"
value="something else" & value="192.168.1.0" # line XX: 192.168.1.0: syntax error: invalid arithmetic operator (error token is ".168.1.0")

我很确定我错过了一些基本的东西,但我现在无法理解:P。

1 个答案:

答案 0 :(得分:2)

首先,$[...] bash语法已过时,不应使用。

现在,它将其内容评估为算术表达式。当您输入字符串时,is被解释为变量,并且其值再次被计算为算术表达式。取消设置变量时,它的计算结果为零。

如果你输入一个单词的字符串,这些规则会使它扩展为零。如果放入一个包含多个单词的字符串,则扩展失败,因为单词被解释为变量,没有中间算术运算符,这是一个错误。这就是你所看到的。

您可能想要的是将value=$[${CfgData[$COUNTER]}]替换为value=${!CfgData[$COUNTER]}

让我补充一点,你的脚本可能会更好地编写没有索引,如

for varname in "${CfgData[@]}"; do
    value=${!varname}
    echo -ne "$varname=$value"
done