2017-05-14 38 views
0

我被打包在bash腳本上。 我有一個config.ini文件的文件是這樣的:從ini文件中提取信息並添加到關聯數組(Bash)

#Username 
username=user 

#Userpassword 
userpassword=password 

,我期待在bash腳本來提取這些信息,並把它放在一個關聯數組。我的腳本是這樣的:

declare -A array 
OIFS=$IFS 
IFS='=' 
grep -vE '^(\s*$|#)' file | while read -r var1 var2 
do 
    array+=([$var1]=$var2) 
done 

echo ${array[@]} 

但陣列似乎是空的,因爲COMMANDE回聲$ {數組[@]}不會有任何輸出。

任何想法,爲什麼我腳本不工作?感謝您的幫助,並對我的英語不好。

+1

你爲什麼不只是源ini文件和呼叫的用戶名或作爲的userpassword變量? – grail

+0

噢,我會這樣做。不知道這是做不到的。我只是看了一下谷歌試圖....這是我的解決方案。非常感謝你的聖盃。 –

+0

@RaphaelVigener它實際上非常簡單'。 file'。 – 123

回答

1

常見錯誤 - 「grep | while」會導致while循環在單獨的shell中執行,並且循環內的變量對於shell而言不是全局的。使用此字符串,而不是:

while read -r var1 var2 
do 
    array+=([$var1]=$var2) 
done <<< $(grep -vE '^(\s*$|#)' file) 
+0

嗨,韋恩,謝謝你的快速回答。不幸的是,它不起作用$ var1變成「用戶名用戶」,$ var2保持空白。用我的代碼$ var1成爲「用戶名」,$ var2成爲「用戶」。 –

+0

我建議稍微修改Wayne的答案:'declare -A array;而IFS ==讀取-r鍵值; do array [「$ key」] =「$ value」;完成< Cyrus

+0

在Bash 4.3.30中的這個字符串中的無引號擴展:輸出在'IFS'字符上被分割,然後將與_spaces_一起。在Bash 4.4.11上有效。但是,過程替換'<(...)'可能更好,因爲它不會等待生成整個字符串,而是像管道一樣工作。 – ilkkachu

0

假設該文件可以被信任(即含量調節和已知的),最簡單的方法是將源ini文件,然後在腳本中直接使用的變量名:

. config.ini 

您可以使用句號(。)如上或源內建命令