【发布时间】:2014-10-05 20:57:22
【问题描述】:
foo()
{
mapfile -t arr <<< "${1}"
for i in "${!arr[@]}"
do
if [ -z "${arr[$i]}" ]
then
unset arr[$i]
fi
done
}
当我传递一个包含一些内容的变量(基本上是一个大字符串)时,我想:
- 将第一个空格之前的第一个单词解释为键,第一个空格之后的所有内容都将成为我的关联数组中该键的条目
- 跳过空行或仅包含换行符的行
示例(为了简洁,不包括空行)
google https://www.google.com
yahoo https://www.yahoo.com
microsoft https://www.microsoft.com
数组应该是这样的
[ google ] == https://www.google.com
[ yahoo ] == https://www.yahoo.com
[ microsoft ] == https://www.microsoft.com
我在 bash 手册中没有找到任何好的解决方案来解决这两个点,你看到的函数 foo 是一种创建数组的 hack,然后才遍历整个数组并删除字符串为空的条目。
所以第 2 点得到了一个解决方案,可能是一个效率低下的解决方案,但它有效,但第 1 点仍然没有一个好的解决方案,替代解决方案是在使用 read 迭代时创建一个数组,到目前为止据我所知。
你知道如何改进吗?
【问题讨论】:
-
这也是我不愿意使用
read的原因,read通常会随机排列条目并且不会复制原始顺序,mapfile通常会将内容保存在与原始字符串/文件的顺序相同。 -
mapfile将所有内容保持在原始顺序,因为它不会创建关联数组。read与您构建的数组无关,但可能您实际上是在使用关联数组时一次一个地添加项目。 -
@chepner 这就是我想要的,一个
mapfile,它创建了我的帖子中描述的关联数组,我对这两个点是否可行没有最后的决定只是来自 bash 的内置命令。
标签: arrays bash associative-array