使用变量(即IP地址)作为关联数组的键会产生错误

时间:2014-01-31 00:47:23

标签: linux bash shell associative-array

这是我的功能,我正在读取文件,按空格分割每一行并创建一个数组。我想使用数组中的第一个和第二个元素作为关键数组的键和值。第一个元素是IP地址。

function testRead {
  NEWHOST_IPS_OUT=<my_file>
  declare -a HOSTS_IP_ARR
  while read line
  do
      if [[ -z "$line" ]] || [[ "$line" =~ "#" ]]; then
              continue
      fi

      STR_ARRAY=($line)
      HOST_IP=${STR_ARRAY[1]}
      HOST_AZ=${STR_ARRAY[2]}

      HOSTS_IP_ARR["$HOST_IP"]="${HOST_AZ}"
      HOSTS_IP_ARR[hello]=2

  done < "$NEWHOST_IPS_OUT"
}

问题&amp;调查结果:

* declare -A doesn't work, using `GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)`

./ test.sh:line 4:声明:-A:无效选项 声明:用法:声明[-afFirtx] [-p] [name [= value] ...]

* I tested with constant values using '-a' for an associative array. It worked

* On running this script I get the following error:

./ test.sh:line 14:127.0.0.1:语法错误:算术运算符无效(错误标记为“.0.0.1”)

 This is line 14: HOSTS_IP_ARR["$HOST_IP"]="${HOST_AZ}"

2 个答案:

答案 0 :(得分:1)

declare -a创建一个常规的非关联数组。

它似乎是关联的:

declare -a arr
arr["somekey"]=42
echo "${arr["somekey"]}"  # gives 42

但是

arr["someotherkey"]=1000
echo "${arr["somekey"]}"  # now gives 1000

这是因为"somekey""someotherkey"被解释为算术表达式。 Bash尝试将它们查找为变量名称,找到它们未设置,因此将值视为0

127.0.0.1是一个无效的算术表达式,这就是你得到那个错误的原因。

答案 1 :(得分:1)

declare -A doesn't work, using `GNU bash, version **3.2.25(1)-release** (x86_64-redhat-linux-gnu)`

有你的问题。关联数组仅在版本4中引入bash。