2017-05-14 39 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 

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