我正在尝试创建一个如下所示的数组:
nPrecision
使用grubby命令,我正在寻找的entires的输出是:
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
(为了消毒,我删除了“args =”行)
当我尝试使用以下有效的命令时...(错误...对于数组的前2个元素)。它决定将2个指标压成一个。
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)
首先为什么要这样做?我该如何解决?
我知道还有其他方法可以解决这个问题,但我想了解这里发生了什么:
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
你得到两行输出,IFS =在'='上分开并忽略'\ n'
我尝试使用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
想法在一行中输出所有内容,但它变得混乱。
必须有一种更优雅的方式来使用具有多行输出的hereto字符串。当然...
答案 0 :(得分:1)
您可以将进程替换与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]
答案 1 :(得分:0)
好的,所以我意外地使用上面发布的exta信息进行了清晰的了解
IFS='=' read -a KERNELS <<< $(sudo grubby --info=ALL |grep -v rescue |grep -E 4.[78] |grep kernel | awk '{print}' ORS='=')
for i in ${!KERNELS[@]}; do echo ${KERNELS[$i]} $i; done
kernel 0
/boot/vmlinuz-4.8.0-1.el7.elrepo.x86_64 1
kernel 2
/boot/vmlinuz-4.7.3-1.el7.elrepo.x86_64 3
我已经使用awk来解决这样一个事实:有多行终止&#39; \ n&#39;而是插入一个&#39; =&#39;这将是构建数组的分界因素。 =]