arrays - Bash 数组分组元素

标签 arrays linux bash

我正在尝试创建一个如下所示的数组:

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/

相关文章:

python - 如何从元素列表开始进行回归

linux - 无法通过脚本执行登录命令并设置DISPLAY变量

python - 是否可以使用 pexpect 生成将显示在 bash 历史记录中的 bash shell 命令?

bash - 在同一行 Bash 上排序

bash - 计算 HDFS 文件夹中具有给定扩展名的文件数

objective-c - 一次比较六个数组

javascript - 使用 JavaScript 从网格数组中删除列

mysql - 在不导出 SQL 文件的情况下在 Linux CLI 中复制 MySQL 数据库

linux - bugzilla 所需的 apache 2.4 的 mod_perl.so

Java-在一定条件下向后迭代数组