我尝试在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
被正确填充。
你能帮助我理解为什么第一个代码提取不起作用而第二个代码提取不起作用吗?我做错了什么?
答案 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)
您无需使用ls
,read
或进程替换。只需使用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)* )