Использование & ldquo; while read & hellip; & rdquo; в сценарии linux

Вы также можете исключить несколько путей в фигурных скобках:

rsync -arv --exclude={.ccache,build} /home/ben /media/ben/thumbdrive/
1
задан 25 July 2016 в 23:55

1 ответ

Переписывание цикла таким образом показывает, что происходит:

echo '1 2 3 4 5 6' | while read a b c
  do
    echo '(iteration beginning)' a="$a" b="$b" c="$c" '(iteration ending)'
  done

Это дает в качестве вывода:

(iteration beginning) a=1 b=2 c=3 4 5 6 (iteration ending)

Обратите внимание, что сначала выполняется только одна команда эха , Если он был запущен более одного раза, вы, между прочим, могли бы видеть подстроки (iteration beginning) и (iteration ending), напечатанные более одного раза.

Это означает, что здесь есть while на самом деле ничего не добиться. Встроенный модуль read считывает текст, разделенный пробелами, в каждую указанную переменную. Дополнительный ввод добавляется к концу последней указанной переменной.2 Таким образом, переменные a и b принимают значения 1 и 2 соответственно, а c принимает значение 3 4 5 6.

Когда условие цикла (while read a b c) оценивается во второй раз, из канала больше не поступает вход (мы передавали только одну строку текста), поэтому команда read вычисляет значение false вместо

1: Чтобы быть техническим и конкретным, встроенная функция read при передаче имен переменных в качестве аргументов считывает ввод, разделяет его

1: быть техническим и конкретным, встроенный read при передаче имен переменных в качестве аргументов , читает ввод, разбивая его на отдельные слова, когда он встречает пробелы IFS (см. также этот вопрос и эту статью).

23
ответ дан 23 May 2018 в 21:48
  • 1
    Элайя, спасибо, что нашли время, чтобы объяснить все подробности. Я подозревал, что while не служил своей обычной цели в этом примере, но тогда команда read отбросила меня ... Как-то я интерпретировал ее как «, а read a b c не является ложным, do echo ... & Quot ;. Спасибо, что объяснили, как это работает. Я наткнулся на этот код вчера и знал, что это будет ошибка, пока я не выясню это ... lol – linuxgringo 4 April 2015 в 05:22
  • 2
    @linuxgringo На самом деле тело цикла равно , выполняемое каждый раз, когда read a b c принимает значение true, а условие цикла (read a b c) выполняется более одного раза. Бит он оценивает только true в первый раз. Второй раз, больше нет ввода для чтения из канала, поэтому конец файла встречается, в результате чего read возвращает false . (См. Последний раздел вывода help read, «Статус выхода» и «Подробности», отметив, что в сценариях оболочки нуль означает «Истина» и «Нет нуля» означает «ложь».) Если вы передали несколько строк ввода while read ..., тело цикла будет выполняться несколько раз. – Eliah Kagan 4 April 2015 в 06:05

Другие вопросы по тегам:

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