首页 > 解决方案 > Bash - 将 kpartx 输出提取到变量

问题描述

我想从 kpartx 工具中提取输出:

add map loop18p1 (253:0): 0 1048576 linear 7:18 2048
add map loop18p2 (253:1): 0 1046528 linear 7:18 1050624

然后将 loop18p1 和 loop18p2 保存到 $a 和 $b。

kpartx="$(sudo kpartx -av $IMAGE_FILE)"
read PART_FAT32 PART_NTFS <<<$(grep -o 'loop.p.' <<<"$kpartx")
a=/dev/mapper/$PART_FAT32
b=/dev/mapper/$PART_NTFS

echo $a
echo $b

但不知何故,它似​​乎不起作用,我总是得到空变量:

/dev/mapper/
/dev/mapper/

亲切的问候,

果烷

标签: bashautomation

解决方案


我本来打算继续努力的,但查尔斯·达菲突然介入,通过评论几乎说了同样的话,所以我把它留在这里留给后代。我的目标是完成诊断问题的过程。

让我们来看看你的代码。我将使用此图像进行测试。

你从这个开始:

kpartx="$(sudo kpartx -av $IMAGE_FILE)"

在我的系统上,这意味着:

$ IMAGE_FILE=2018-11-13-raspbian-stretch-lite.img
$ kpartx="$(sudo kpartx -av $IMAGE_FILE)"
$ echo "$kpartx"
loop3p1 : 0 89854 /dev/loop3 8192
loop3p2 : 0 3547136 /dev/loop3 98304

您的输出可能看起来不同,但这足以让我们测试其余代码。

接下来,您尝试$kpartx使用嵌套<<<表达式从变量中提取设备名称:

$ read PART_FAT32 PART_NTFS <<<$(grep -o 'loop.p.' <<<"$kpartx")

这让我:

$ echo $PART_FAT32
loop3p1
$ echo $PART_NTFS

换句话说,$PART_NTFS是空的。那是因为read只在单行上运行,并且您的grep命令输出多行。结果grep -o 'loop.p.' <<<"$kpartx"是:

$ grep -o 'loop.p.' <<<"$kpartx"
loop3p1
loop3p2

因此,您需要重构提取这些值的方式。


推荐阅读