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)