Bash - извлекает вывод kpartx в переменные - PullRequest
1 голос
/ 07 апреля 2019

Я хочу извлечь вывод из инструмента 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 голосов
/ 07 апреля 2019

loop.p. не соответствует либо loop18p1, либо loop18p2. Как минимум, вам нужно исправить 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"
0 голосов
/ 07 апреля 2019

Если вы предпочитаете более общий способ, вы можете использовать динамические переменные для букв устройства. Примечания: stderr также перенаправляется на grep в случае, если kpartx не может отобразить. объявление массива зависит от оболочки.

# 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 голосов
/ 07 апреля 2019

Я собирался продолжать работать над этим, но Чарльз Даффи подскочил и в значительной степени сказал то же самое в комментариях, так что я просто оставлю это здесь для потомков.Моя цель состояла в том, чтобы пройти через процесс диагностики проблемы.

Давайте пройдемся по вашему коду.Я буду использовать это изображение для своих тестов.

Вы начинаете с этого:

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

Так что вам нужно реорганизовать способ извлечения этих значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...