首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash4将文件读入关联数组

bash4将文件读入关联数组
EN

Stack Overflow用户
提问于 2014-08-12 03:58:14
回答 1查看 9.2K关注 0票数 12

我可以使用一条语句将文件读入常规数组:

代码语言:javascript
复制
local -a ary
readarray -t ary < $fileName

不会发生的是将文件读入assoc。数组。

我有文件创建的控制权,所以如果可能的话,我想尽可能简单地做没有循环的事情。

因此,文件内容可以按如下方式读入:

代码语言:javascript
复制
keyname=valueInfo

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

还有..。

那么,是否可以使用untilfrom之类的方法将这样的文件读取到assoc数组中-即读取assoc数组直到它命中一个单词,或者我必须将其作为循环的一部分来执行?

这将允许我在同一个文件中保留许多相似的值,但读取到不同的数组中。

我也看过mapfile,但和readarray做的一样。

终于..。

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

代码语言:javascript
复制
local -a arr=("${!1}")
select option in ${arr[*]}; do
    echo ${option}
    break
done

工作正常-但是显示的列表没有排序。如果可能的话,我想把它整理一下。

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-12 04:00:21

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

代码语言:javascript
复制
local -A ary

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

代码语言:javascript
复制
declare -A ary

如果是BASH_VERSION >= 4.2,则使用-g

如果您的线路有keyname=valueInfo,使用readarray,您可以这样处理它:

代码语言:javascript
复制
readarray -t lines < "$fileName"

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

也可以选择使用while read循环:

代码语言:javascript
复制
while IFS= read -r line; do
    ary[${line%%=*}]=${line#*=}
done < "$fileName"

代码语言:javascript
复制
while IFS== read -r key value; do
    ary[$key]=$value
done < "$fileName"
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25251353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档