Bash-将kpartx输出提取到变量

时间:2019-04-07 00:04:32

标签: bash automation

我想从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/

亲切的问候,

jamefane

3 个答案:

答案 0 :(得分:0)

我本来会继续努力,但查尔斯·达菲(Charles Duffy)突然加入进来,并通过评论说了同样的话,因此我将其留给后人参考。我的目标是逐步诊断问题。

让我们遍历您的代码。我将使用this image进行测试。

您从此开始:

url = "https://a1.example.com/Feature1/3/EditEntry/someGuid?token=token"

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

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"

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

答案 1 :(得分:0)

$ grep -o 'loop.p.' <<<"$kpartx" loop3p1 loop3p2 loop.p.loop18p1都不匹配。至少,您需要将loop18p2修改为类似grepgrep -E -o 'loop[[:digit:]]+p[[:digit:]]+'是“一个或多个”修饰符;因此+可以匹配一个POSIX ERE中的一个或多个数字,这是[[:digit:]]+启用的语法)。

但是,比这更好的是,要了解所读取内容的语法,而不仅仅是尝试盲目匹配内容。

grep -E

答案 2 :(得分:0)

如果您喜欢更通用的方式,则可以将动态变量用于设备字母。注意:如果kpartx无法映射,stderr也将重定向到grep。数组的声明取决于shell。

# dynamic variable list for device letters
declare -a DEV=({a..z})

# assign kpartx results to device letters
for PART in $(sudo kpartx -av "$IMAGE_FILE" 2>&1 | grep -owE '(loop[0-9]+p[0-9]+)')
  do
    eval ${DEV[${i:-0}]}=/dev/mapper/$PART
    i=$((${i:-0}+1))
done

echo $a
echo $b