我想从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
答案 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
修改为类似grep
(grep -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