bash4将文件读入关联数组

mon*_*-dr 7 arrays file associative bash4

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

local -a ary
readarray -t ary < $fileName
Run Code Online (Sandbox Code Playgroud)

没有发生的是将文件读入assoc.阵列.

我可以控制文件创建,因此如果可能的话,我希望尽可能简单地执行w/o循环.

因此,文件内容可以被读入:

keyname=valueInfo
Run Code Online (Sandbox Code Playgroud)

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

而......

因此,才有可能读这样的文件到使用的东西的assoc命令阵列像until 或者from-即读入assoc命令阵列直到碰到一个字,或者我不得不这样做,因为循环的一部分吗?

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

我也看了mapfile,但是也一样readarray.

最后......

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

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

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

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

谢谢.

kon*_*box 16

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

local -A ary
Run Code Online (Sandbox Code Playgroud)

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

declare -A ary
Run Code Online (Sandbox Code Playgroud)

或者使用-gif BASH_VERSION >= 4.2.

如果你的行有keyname=valueInfo,readarray你可以像这样处理它:

readarray -t lines < "$fileName"

for line in "${lines[@]}"; do
   key=${line%%=*}
   value=${line#*=}
   ary[$key]=$value  ## Or simply ary[${line%%=*}]=${line#*=}
done
Run Code Online (Sandbox Code Playgroud)

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

while IFS= read -r line; do
    ary[${line%%=*}]=${line#*=}
done < "$fileName"
Run Code Online (Sandbox Code Playgroud)

要么

while IFS== read -r key value; do
    ary[$key]=$value
done < "$fileName"
Run Code Online (Sandbox Code Playgroud)

  • konsolebox - 只想说声谢谢!所有的代码都运行得非常好。终于实现了! (2认同)