bash, как расставить ";" [РЕШЕНО]

подскажите, есть ли простой способ расставить ";" в строке?
такая команда lsblk -o NAME,FSTYPE,MOUNTPOINT,LABEL,UUID,PARTLABEL,RM,MODEL,SERIAL,SIZE,ROTA,TYPE,TRAN,VENDOR -a -P
возвращает строку
NAME="sda" FSTYPE="" MOUNTPOINT="" LABEL="" UUID="" PARTLABEL="" RM="0" MODEL="Hitachi HDS72105" SERIAL="JP1532FR3938TK" SIZE="465,8G" ROTA="1" TYPE="disk" TRAN="sata" VENDOR="ATA     "
так вот как ее преобразовать в переменные баша?
как видно разделитель пробел тут не канает что бы его заменить на ";" , нужно после закрывающей кавычки поставить ";" .
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Это можно сделать, но:
1) рискованно, потому как есть ничто иное, как исполнение непроверенного кода;
2) lsblk достаточно гибок, чтобы выдавать ответы не только в "человекочитаемом", но и в "машиночитаемом" виде.

Обычно я использую в скриптах такую конструкцию:
while read -r СПИСОК ПЕРЕМЕННЫХ
do
 ...
done < <(lsblk -drno СПИСОК,КОЛОНОК список устройств)
Тогда он выводит просто строки со значениями без имён, разделяя значения пробелами, который можно читать в цикле с помощью read , а значения с пробелами и прочими спецсимволами можно потом декодировать с помощью конструкции
printf -v ПЕРЕМЕННАЯ '%b' "$ПЕРЕМЕННАЯ"

Разумеется, в этом случае список колонок надо сформировать в таким порядке, чтобы пустые значения не могли оказаться в середине строки – таково ограничение моего способа.
Впрочем, при желании, есть способы прочитать строку с учётом пустых значений по числу пробелов :)
Natrio
Разумеется, в этом случае список колонок надо сформировать в таким порядке, чтобы пустые значения не могли оказаться в середине строки – таково ограничение моего способа.
не приемлемое ограничение!
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Ну я же сказал – есть способы :)
С помощью tr заменяем пробел на запятую, и заставляем read использовать запятую как разделитель, ибо пробелы она толкует в любом количестве как один, а запятые – строго по одной:
while IFS=',' read -r СПИСОК ПЕРЕМЕННЫХ
do
 ...
done < <(lsblk -drno СПИСОК,КОЛОНОК список устройств | tr ' ' ',')

P.S.
Я обычно не жадничал, и получал только нужные скрипту колонки, поэтому ограничение мне не мешало. Сей способ с запятыми я придумал только что, раньше как-то не требовалось.

P.P.S.
Если убрать ключ -d , можно получить от lsblk вывод по всем устройствам без предварительного списка. У меня была обратная цель – не трогать лишние устройства, поэтому я его и добавил.
Natrio, благодарю, то что нужно. но вот запятую нужно заменить на символ который 100% не может встречаться в выводе.
вопрос теперь какой это символ?
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
nafanja
вопрос теперь какой это символ?
что бы долго не париться взял комбинацию из нескольких разных символов...
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Прошу прощения, лопухнулся с запятой, думал что lsblk её закодирует как "потенциально опасный символ".
Можно использовать, к примеру, \r, он точно кодируется:
while IFS=$'\r' read -r СПИСОК ПЕРЕМЕННЫХ
do
 ...
done < <(lsblk -drno СПИСОК,КОЛОНОК список устройств | tr ' ' '\r')

А вот с комбинацией ничего не выйдет – в IFS как разделитель воспринимается не комбинация, а любой из перечисленных символов.
Natrio
А вот с комбинацией ничего не выйдет – в IFS любой символ воспринимается как разделитель, а не комбинация.
Да, точно!
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
nafanja
но вот запятую нужно заменить на символ который 100% не может встречаться в выводе.
вопрос теперь какой это символ?
Можно какой-нибудь % или @
GitHub, ArchWiki, AUR
Kycok
Можно какой-нибудь % или @
Нет, их тоже вполне можно засадить в метку, и lsblk не закодирует.
\r вполне подходит - lsblk заменит его на код, и в выводе его не будет с гарантией.
 
Зарегистрироваться или войдите чтобы оставить сообщение.