有没有一种方法可以从bash中的文本文件创建关联数组?

时间:2020-02-07 09:51:06

标签: bash git-bash

我当前正在创建命令列表,因此例如通过说“ directory install plugin-name”,我可以安装外部列表中指定的所有必需插件。此列表只是带有所有插件名称的txt文件。但是我正在努力将所有名称都放在一个关联数组中。

我尝试过这个:

while IFS=";" read line;
do " communtyList[ $line ]=1 " ;
done < community-list.txt;

所需的输出应该是

  • communityList[test1]=1
  • communityList[test2]=1 ....

它必须是一个关联数组,因为我想通过单词而不是索引来访问它。这个词将被实现为参数/参数。

例如,以“安装插件”代替“ 1个插件”

所以我可以这样问:

if [ ! -z "${!communtyList[$2]}" ];

更新,这里是整个代码:

#!/usr/bin/env bash
community(){
declare -A communtyList
while IFS= read line;
do communtyList[$line]=1 ;
done < community-list.txt;
#     communtyList[test1]=1
#     communtyList[test2]=1
#     communtyList[test3]=1
#     communtyList[test4]=1
if { [ $1 = 'install' ] || [ $1 = 'activate' ] || [ $1 = 'uninstall' ] || [ $1 = 'deactivate' ] ; } && [ ! -z $2 ] ;  then
     if [ $2 = 'all' ];
        then echo "$1 all community plugins....";
        while IFS= read -r line; do echo "$1  $line "; done < community-list.txt;
     elif [ ! -z "${!communtyList[$2]}" ];
        then echo "$1 community plugin '$2'....";
     else
        echo -e "\033[0;31m Something went wrong";
        echo " Plugin '$2' does not exist.";
        echo " Here a list of all available community plugins: ";
        echo ${!communtyList[@]}
        echo -e " \e[m"
    fi
else
    echo -e "\033[0;31m Something went wrong";
    if [ -z $2 ];
        then echo -e "[Plugin name] required. [community][action][plugin name] \e[m"
    else
        echo " Action '$1' does not exist.";
        echo -e " Do you mean some of this? \n install \n activate \n uninstall \e[m"
    fi
fi
echo ${!communtyList[@]}
}
"$@"

2 个答案:

答案 0 :(得分:1)

要使用关联数组,您必须先声明它

declare -A communityList

然后您可以添加值

communityList[test1]=1
communityList[test2]=2
...

或带有声明

declare -A communityList=(
    communityList[test1]=1
    communityList[test2]=2
    ...
)

答案 1 :(得分:1)

" communtyList[ $line ]=1 "周围的引号表示您尝试评估第一个字符为空格的命令。您想删除那些引号,并可能将引号放在"$line"周围。

还不清楚为什么要使用IFS=";" -您仍然不会将行拆分为多个字段,因此这没有任何用处。输入文件中是否有分号?在哪里和为什么;他们是什么意思?

除非您特别要求read -r用输入中的反斜杠来做奇怪的事情,否则您应该更喜欢read

最后,按照Ivan的建议,在尝试使用数组之前,必须将其声明为关联类型。

解决了这些问题,然后尝试

declare -A communityList

while read -r line; do
    communtyList["$line"]=1
done < community-list.txt