在bash中将命令的输出拆分为关联数组

11

输出结果为

/     ext4
/boot ext2
tank  zfs

每行的分隔符是空格。我需要一个类似于关联数组的数据结构:

"/" => "ext4", "/boot" => "ext2", "tank" => "zfs"

在bash中如何完成这个操作?


非常遗憾,您不能在Bash的关联数组键中使用斜杠。请问您最终想要实现什么目标,这样我可以建议解决方法? - Wintermute
3
@Wintermute,抱歉?确实可以;在键的内容中,唯一无效的字符是NUL。你有测试过这个说法吗? - Charles Duffy
@CharlesDuffy 在我的 bash 4.3 中无法使用 arr[/]=bar,其他任何带有 / 的语句也不行。出现的错误是 bash: /: syntax error: operand expected (error token is "/")。加引号也没用。 - Wintermute
1
@CharlesDuffy噢,我太蠢了,我的错。忘记了“declare -A”,没有记得它是必要的。我现在会去角落里待着。 - Wintermute
1个回答

19

如果命令输出在文件 file 中,则:

$ declare -A arr=(); while read -r a b; do arr["$a"]="$b"; done <file

或者,您可以直接从命令cmd读取数据并将其存储到数组中,如下所示:

Or, 您可以 直接 从 命令 cmd 读取数据 into 一个 数组 as follows:

$ declare -A arr=(); while read -r a b; do arr["$a"]="$b"; done < <(cmd)

构造语法<(...)进程替换。它允许我们像读取文件一样从命令中读取数据。请注意,两个<之间的空格至关重要。

您可以使用declare -p验证数据是否已正确读取:

$ declare -p arr
declare -A arr='([tank]="zfs" [/]="ext4" [/boot]="ext2" )'

3
哇,这让我大开眼界,我肯定需要研究一下数组。 - ShellFish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接