我正在尝试从数组元素创建变量,并在源文件中检查我创建的变量的值。
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。
答案 0 :(得分:2)
首先,$[...]
bash语法已过时,不应使用。
现在,它将其内容评估为算术表达式。当您输入字符串时,is被解释为变量,并且其值再次被计算为算术表达式。取消设置变量时,它的计算结果为零。
如果你输入一个单词的字符串,这些规则会使它扩展为零。如果放入一个包含多个单词的字符串,则扩展失败,因为单词被解释为变量,没有中间算术运算符,这是一个错误。这就是你所看到的。
您可能想要的是将value=$[${CfgData[$COUNTER]}]
替换为value=${!CfgData[$COUNTER]}
。
让我补充一点,你的脚本可能会更好地编写没有索引,如
for varname in "${CfgData[@]}"; do
value=${!varname}
echo -ne "$varname=$value"
done