0

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

我的源文件:

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。

4

1 回答 1

2

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

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

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

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

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

for varname in "${CfgData[@]}"; do
    value=${!varname}
    echo -ne "$varname=$value"
done
于 2013-11-06T18:20:35.307 回答