bash将文件读入关联数组

时间:2014-08-11 19:58:14

标签: arrays file associative bash4

我能够使用单个语句将文件读入常规数组:

local -a ary
readarray -t ary < $fileName

没有发生将文件读入assoc。阵列。

我可以控制文件创建,所以如果可能的话,我希望尽可能简单地进行循环。

因此可以将文件内容读入:

keyname=valueInfo

但是如果减少代码,我愿意用另一个字符串替换=,特别是在上面的单行代码中。

并......

那么可以使用像untilfrom之类的东西将这样的文件读入一个关联数组 - 即读入一个关联数组,直到找到一个单词,或者我是否需要这是循环的一部分吗?

这将允许我在同一个文件中保留许多类似的值,但是读入单独的数组。

我也看了mapfile,但与readarray相同。

最后......

我正在创建一个选项列表 - 从中​​选择 - 如下所示:

local -a arr=("${!1}")
select option in ${arr[*]}; do
    echo ${option}
    break
done

工作正常 - 但显示的列表未排序。如果可能的话,我想对它进行分类。

希望可以将所有3个问题都归为1,因为问题相似 - 都是在数组上。

谢谢。

1 个答案:

答案 0 :(得分:12)

首先,关联数组声明为-A而不是-a

local -A ary

如果要在全局范围内声明变量,请在函数外部使用declare

declare -A ary

如果-g,请使用BASH_VERSION >= 4.2

如果您的行确实有keyname=valueInforeadarray,则可以这样处理:

readarray -t lines < "$fileName"

for line in "${lines[@]}"; do
   key=${line%%=*}
   value=${line#*=}
   ary[$key]=$value  ## Or simply ary[${line%%=*}]=${line#*=}
done

使用while read循环也可以是一个选项:

while IFS= read -r line; do
    ary[${line%%=*}]=${line#*=}
done < "$fileName"

或者

while IFS== read -r key value; do
    ary[$key]=$value
done < "$fileName"