我想从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/致以亲切的问候,
亚美芬
发布于 2019-04-07 00:50:28
我本来打算继续做这件事的,但是查尔斯·达菲突然冲了进来,并通过评论说了同样的话,所以我会把这个留给后人。我的目标是完成诊断这个问题的过程。
让我们来看看你的代码。我将使用这幅图像进行测试。
你先从这个开始:
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所以你需要重构你是如何提取这些值的。
发布于 2019-04-07 00:50:43
loop.p.与loop18p1或loop18p2都不匹配。至少,您需要将grep修复为类似于grep -E -o 'loop[[:digit:]]+p[[:digit:]]+' (+是“一个或多个”修饰符;因此[[:digit:]]+匹配POSIX中的一个或多个数字,这是grep -E启用的语法)。
不过,比这更好的是要注意您正在阅读的内容的语法,而不是试图盲目匹配内容。
{
read -r _ _ part_fat32 _ # first line: read third word into part_fat32
read -r _ _ part_ntfs _ # second line: read third word into part_ntfs
} < <(sudo kpartx -av "$IMAGE_FILE")
a="/dev/mapper/$part_fat32"
b="/dev/mapper/$part_ntfs"发布于 2019-04-07 12:50:31
如果您更喜欢一种更通用的方法,您可以为设备字母使用动态变量。注意:如果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 $bhttps://stackoverflow.com/questions/55554525
复制相似问题