繁体   English   中英

Bash数组分组元素

[英]Bash array grouping elements

我正在尝试创建一个看起来像这样的数组:

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

使用肮脏的命令,我正在寻找的输出是:

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个索引压缩为1个。

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]

好的,所以我偶然使用以上发布的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解决了以下事实:有多行以'\\ n'结尾,而是插入了'=',这将是构建数组的定界因素。 =]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM