对于命令输出中的每一行,添加到数组

时间:2016-12-03 18:01:48

标签: arrays bash pipe heredoc

我尝试在bash脚本中执行以下操作:将所有不以/dev/sda开头的设备节点文件添加到名为devices的数组中。由于脚本将在只读文件系统上执行,我 不能 在这里使用文档。

这是我的代码:

devices=()
ls -1 /dev/hd* /dev/sd* | while read -r device; do
    if [[ "$device" != "/dev/sda"* ]]; then
        devices+=($device)
    fi
done

我不明白为什么,在命令结束时,devices仍然是空的。例如,我可以通过在将数据添加到数组之前/之后添加命令echo $device来成功打印每个项目。但是他们为什么不加入?

另外,如果我在这里运行相同的命令文档一切正常:

devices=()
while read -r device; do
    if [[ "$device" != "/dev/sda"* ]]; then
        devices+=($device)
    fi
done <<< $(ls -1 /dev/hd* /dev/sd*)

在这些命令的末尾,数组devices被正确填充。

你能帮助我理解为什么第一个代码提取不起作用而第二个代码提取不起作用吗?我做错了什么?

2 个答案:

答案 0 :(得分:0)

好的。我通过使用bash Process Substitution解决了我的问题:

devices=()
while read -r device; do
    if [[ "$device" != "/dev/sda"* ]]; then
        devices+=($device)
    fi
done < <(ls -1 /dev/hd* /dev/sd*)

这种方式有效。

答案 1 :(得分:0)

您无需使用lsread或进程替换。只需使用for循环。

devices=( /dev/hd* )
for device in /dev/sd*; do
    [[ $device != /dev/sda* ]] && devices+=("$device")
done

事实上,对于扩展模式,您甚至不需要循环。

shopt -s extglob
devices=( /dev/hd* /dev/sd!(a)* )