2017-02-14 116 views
3

我有file.properties,其中是鍵和值來定義:迭代陣列

key1=value1 value2 value3 
key2=value4 value5 value6 
key3=value7 value8 value9 

我想要加載從文件陣列線。我不能使用申報-A創建因爲bash的3

的關聯數組在bash 4我的代碼是:

conf="./file.properties" 

init() { 
local configiration=$1 
if [ -f "$conf" ] 
then 
    while IFS='=' read -r key value 
    do 
     configuration[ ${key} ]=$value 
    done < "$conf" 
fi} 
declare -A configuration 
init configuration 

KEY="key value from file" 
#KEY="key1" or KEY="key2" or KEY="key3" 
SERVERS=${configuration[ $KEY ]} 

我想要做同樣的工作,在bash的3

conf="./file.properties" 
init() { 
key=() 
value=() 
if [ -f "$conf" ] 
then 
    while IFS='=' read -r key value 
    do 
     key+=("$key") 
     value+=("$value") 
    done < "$conf" 
fi} 
init 
KEY="key value from file" 
#KEY="key1" or KEY="key2" or KEY="key3" 
for ((i = 0; i < ${#key[@]}; i++)) 
    do 
    if [ "${key[$i]}" == "$KEY" ]; 
    then 
     echo "values: ${value[i]}" 
    fi 
done 

在這兩種情況下,我得到的結果相同,例如:

value1 value2 value3 

是我的代碼的bash 3正確或事情已經進行修訂?

+0

當你從文件「'KEY」鍵值時,它實際上包含了什麼?你能提供它,以便我們可以真正測試它嗎? – Inian

+0

此外,它不能重現你所聲稱的問題,運行'KEY =「key1」','KEY =「key2」','KEY =「key3」''bash v3.0''代碼產生的輸出爲'values:value1 value2 value3','values:value4 value5 value6' and'values:value7 value8 value9' each!這不是你想要做的嗎?那麼你的問題是什麼? – Inian

+0

如果你只是問你是否已經用一對索引數組正確地模擬了一個關聯數組,那麼答案大部分是肯定的。 – chepner

回答

0

這對我來說看起來是正確的,因爲您使用適當的方式遍歷數組,因爲您之前已經創建了它們,並且知道數組的鍵將在0,1,...,n-1之內,用於您的數組,大小爲n。該array+=(elements)運營商總是將elementsarray開始array的最後一個索引+ 1

在那裏我會遍歷數組不同的是,如果它不保證該指數在[0,n)的唯一情況。例如:

declare -ai roots=(); 
declare -i x y; 
for ((x=0; x<4; roots[x*x]=x,++x)) do :; done; 
for y in "${!roots[@]}"; do 
    printf 'sqrt(%d) = %d\n' $y ${roots[y]}; 
done; 

通過擴大使用"${!roots[@]}"roots指數越過它進行迭代,我們得到以下的輸出:

sqrt(0) = 0 
sqrt(1) = 1 
sqrt(4) = 2 
sqrt(9) = 3 

在這樣的情況下,我們必須避免算術for環路避免像下面這樣發生:

$ for((i=0;i<${#roots[@]};++i)); do echo "${roots[i]}"; done; 
0 
1 
  
  

我會做的唯一更改是使用[[而不是[來執行字符串比較,因爲它是一個bash內建函數,它通常更安全並且更高效。另外,我相信你需要一個換行符或;之前您的}關閉您的init功能。