2014-01-31 41 views
0

這是我正在讀取文件的函數,將每行按空格分隔並創建一個數組。我想使用數組中的第一個和第二個元素作爲關鍵數組的值和值。第一個元素是一個IP地址。對關聯數組使用變量(這是一個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" 
} 

問題&發現:

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

./test.sh:4號線:聲明:-A:無效選項 聲明:用法:申報[-afFirtx] [-p] [名稱[=值] ...]

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

* On running this script I get the following error: 

./test.sh:線14:127.0.0.1:語法錯誤:無效算術運算符(錯誤標記是」 .0.0.1" )

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

回答

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

這是你的問題。關聯數組僅在版本4中引入到bash中。

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"被interpretted爲算術表達式。 Bash試圖將它們視爲變量名稱,未找到它們,因此認爲該值爲0

127.0.0.1是一個無效的算術表達式,這就是爲什麼你會得到這個錯誤。

+0

那麼解決此問題的最佳方法是什麼?你看到的代碼片段用ips和它們相應的區域讀取一個文件。我需要建立IP地址的關聯,以便1個IP只能在1個區域內使用。我是否定義了2個數組併爲兩者使用相同的索引?有沒有更好的方法來做到這一點?最後我想使用每個IP和相應的區域來做一些處理。 – user1071840

+0

@ user1071840使用Bash4或awk –