Для назначения переменного петли с пробелами

После удаления драйверов nvidia и подобных вещей, таких как bumblebee, возврат к Intel должен быть простым:

$ cd /etc/X11/
$ su -  

# Xorg -configure

Что там написано?

0
02.05.2018, 12:29
2 ответа

Проблема заключается в том, что подстановка вашей команды расширяется до строки с разделителями -из пробелов, и цикл повторяется по всем словам в этой строке. «Слово» — это что-либо, разделенное пробелом, табуляцией или символом новой строки.

Также обратите внимание, что в Bourne -, как и в оболочках, отличных от zsh, эти слова в дальнейшем подлежат генерации имени файла (, также известному как подстановка ), поэтому символы подстановки (и {в некоторых оболочках )также будет проблемой в дополнение к пробелу и табуляции.

lssyscfg -r lpar -m "$system" -F name,lpar_env | cut -d, -f 1 | sort |
while IFS= read -r lpar; do
     echo "$lpar"
done

Здесь используется цикл whileвместо статического цикла for. Тело цикла whileвыполняется в подоболочке (в bash), поэтому переменная lparне будет существовать после окончания тела цикла. Это не проблема, если вы используете переменную только в теле цикла.

Связанные:Понимание «IFS= чтение -r строки»

Другим решением было бы установить IFSна новую строку перед циклом (и сбросить его после этого):

oldIFS=$IFS
IFS=$'\n'    # assumes bash
set -o noglob

for lpar in $( lssyscfg -r lpar -m "$system" -F name,lpar_env | cut -d, -f 1 | sort )
do
    echo "$lpar"
done

set +o noglob
IFS=$oldIFS

Значение по умолчанию $IFSвключает пробелы, поэтому исходный цикл выполняет итерации по неправильным вещам. Я также отключил подстановку имен файлов для цикла, так как в противном случае мы могли бы получить неожиданные результаты, если текст, возвращаемый из lssyscfg, включает шаблоны подстановок имен файлов, как обсуждалось выше.

Этот последний вариант, ИМХО, довольно неэлегантен и совершенно не подходит для команд, которые выводят более нескольких строк вывода.

1
28.01.2020, 04:24

Я бы попробовал

for lpar in $(lssyscfg -r lpar -m $system -F name,lpar_env |awk -F, '{printf "\"%s\"",$1}' | sort) 
do
   echo "$lpar"
done
  • использовать $( )как подстановку команды
  • {printf "\"%s\"",$1}будет цитировать аргумент
-1
28.01.2020, 04:24

Теги

Похожие вопросы