【问题标题】:Bash - Extract kpartx output to variablesBash - 将 kpartx 输出提取到变量
【发布时间】:2019-04-07 20:50:31
【问题描述】:

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

亲切的问候,

詹姆士

【问题讨论】:

  • kpartx="$(sduo kpartx -av $IMAGE_FILE)" 我猜有错字,应该是sudo
  • 哦,谢谢,我已经解决了,但我的问题仍然存在:(
  • 您希望该代码如何工作?一方面,loop.p. 期望在loop 中的p 和分隔设备号和分区号的p 之间只有 一个 字符,但在您的示例中,您有 两个字符。
  • ...除此之外,read a b 只读取 one 行,将第一个单词放入 a,并将所有后续单词放入 b。如果您想阅读 行,它应该是 { read firstLine; read secondLine; } &lt; &lt;(...whatever...)(注意使用 process substitution,它可以让您将来自 grep 的输出流式传输到您的 reads,而不是您当前的您需要 grep 完全完成的代码,然后将其输出写入临时文件,然后从该临时文件中读取 read)。
  • 顺便说一句,注意全大写名称用于对 shell 或操作系统有意义的变量;小写名称是为应用程序使用而保留的,因此您应该将其用于在脚本中分配的变量名称。

标签: bash automation


【解决方案1】:

我打算继续努力,但 Charles Duffy 突然介入并通过 cmets 说了同样的话,所以我将把它留在这里以供后代使用。我的目标是完成诊断问题的过程。

让我们来看看你的代码。我将使用this image 进行测试。

你从这个开始:

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

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

接下来,您尝试使用嵌套的&lt;&lt;&lt; 表达式从$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.' &lt;&lt;&lt;"$kpartx" 的结果是:

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

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

【讨论】:

    【解决方案2】:

    loop.p. 不匹配 两者 loop18p1loop18p2。至少,您需要将grep 修复为类似于grep -E -o 'loop[[:digit:]]+p[[:digit:]]+'+ 是“一个或多个”修饰符;因此[[:digit:]]+ 匹配POSIX ERE 中的一个或多个数字,这是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"
    

    【讨论】:

      【解决方案3】:

      如果您喜欢更通用的方式,您可以将动态变量用于设备字母。注意:stderr 也被重定向到 grep,以防 kpartx 无法映射。数组的声明依赖于 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-17
        • 2018-02-02
        • 1970-01-01
        • 2011-10-13
        • 2012-04-28
        • 2010-10-11
        • 1970-01-01
        • 2021-08-22
        相关资源
        最近更新 更多