我正在尝试创建一个如下所示的数组:
0 kernel
1 /boot/vmlinuz-4.8.0-1.el7.elrepo.x86_64
2 kernel
3 /boot/vmlinuz-4.7.3-1.el7.elrepo.x86_64
使用 grubby 命令,我正在寻找的整体输出是:
index=2
kernel=/boot/vmlinuz-4.8.0-1.el7.elrepo.x86_64
root=/dev/mapper/<my_vol>-root
initrd=/boot/initramfs-4.8.0-1.el7.elrepo.x86_64.img
title=CentOS Linux (4.8.0-1.el7.elrepo.x86_64) 7 (Core)
index=3
kernel=/boot/vmlinuz-4.7.3-1.el7.elrepo.x86_64
root=/dev/mapper/<my_vol>-root
initrd=/boot/initramfs-4.7.3-1.el7.elrepo.x86_64.img
title=CentOS Linux (4.7.3-1.el7.elrepo.x86_64) 7 (Core)
(出于清理目的,我删除了“args=”行)
当我尝试使用以下有效的命令时...(错误...对于数组的前 2 个元素)。它决定将 2 个指数合并为一个。
IFS='=' read -a KERNELS <<< $(sudo grubby --info=ALL |grep -v rescue |grep -E 4.[78] |grep kernel)
0 kernel
1 /boot/vmlinuz-4.8.0-1.el7.elrepo.x86_64 kernel
2 /boot/vmlinuz-4.7.3-1.el7.elrepo.x86_64
首先为什么要这样做?我该如何解决?
我知道还有其他方法可以解决这个问题,但我想了解这里发生了什么:
for i in ${KERNELS[@]}; do echo $i; done
kernel
/boot/vmlinuz-4.8.0-1.el7.elrepo.x86_64
kernel
/boot/vmlinuz-4.7.3-1.el7.elrepo.x86_64
for i in ${!KERNELS[@]}; do echo $i ${KERNELS[$i]}; done
0 kernel
1 /boot/vmlinuz-4.8.0-1.el7.elrepo.x86_64 kernel
2 /boot/vmlinuz-4.7.3-1.el7.elrepo.x86_64
我怀疑这与你运行时的事实有关
sudo grubby --info=ALL |grep -v rescue |grep -E 4.[78] |grep kernel
kernel=/boot/vmlinuz-4.8.0-1.el7.elrepo.x86_64
kernel=/boot/vmlinuz-4.7.3-1.el7.elrepo.x86_64
您得到两行输出并且 IFS= 在 '=' 上分隔并忽略 '\n'
我试过使用 awk '{print}' ORS=' '
想法在一行上输出所有内容,但它变得困惑。
必须有一种更优雅的方式来使用带有多行输出的 hereto 字符串。当然……
最佳答案
您可以结合使用进程替换和 read
指令:
arr=()
while IFS='=' read -r k v; do
[[ $k = "kernel" ]] && { arr+=("$k"); arr+=("$v"); }
done < <(sudo grubby --info=ALL)
检查数组内容:
printf '[%s]\n' "${arr[@]}"
[kernel]
[/boot/vmlinuz-4.8.0-1.el7.elrepo.x86_64]
[kernel]
[/boot/vmlinuz-4.7.3-1.el7.elrepo.x86_64]
关于arrays - Bash 数组分组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42646730/