首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将kpartx输出提取到变量

将kpartx输出提取到变量
EN

Stack Overflow用户
提问于 2019-04-07 00:04:31
回答 3查看 446关注 0票数 2

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

代码语言:javascript
复制
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。

代码语言:javascript
复制
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

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

代码语言:javascript
复制
/dev/mapper/
/dev/mapper/

致以亲切的问候,

亚美芬

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-07 00:50:28

我本来打算继续做这件事的,但是查尔斯·达菲突然冲了进来,并通过评论说了同样的话,所以我会把这个留给后人。我的目标是完成诊断这个问题的过程。

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

你先从这个开始:

代码语言:javascript
复制
kpartx="$(sudo kpartx -av $IMAGE_FILE)"

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

代码语言:javascript
复制
$ 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表达式从<<<变量中提取设备名称:

代码语言:javascript
复制
$ read PART_FAT32 PART_NTFS <<<$(grep -o 'loop.p.' <<<"$kpartx")

这让我觉得:

代码语言:javascript
复制
$ echo $PART_FAT32
loop3p1
$ echo $PART_NTFS

换句话说,$PART_NTFS是空的。这是因为read只在一行上操作,而您的grep命令输出多行。grep -o 'loop.p.' <<<"$kpartx"的结果是:

代码语言:javascript
复制
$ grep -o 'loop.p.' <<<"$kpartx"
loop3p1
loop3p2

所以你需要重构你是如何提取这些值的。

票数 1
EN

Stack Overflow用户

发布于 2019-04-07 00:50:43

loop.p.loop18p1loop18p2都不匹配。至少,您需要将grep修复为类似于grep -E -o 'loop[[:digit:]]+p[[:digit:]]+' (+是“一个或多个”修饰符;因此[[:digit:]]+匹配POSIX中的一个或多个数字,这是grep -E启用的语法)。

不过,比这更好的是要注意您正在阅读的内容的语法,而不是试图盲目匹配内容。

代码语言:javascript
复制
{
  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"
票数 0
EN

Stack Overflow用户

发布于 2019-04-07 12:50:31

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

代码语言:javascript
复制
# 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55554525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档