Переписування циклу таким чином виявляє, що відбувається:
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)
Спершу зауважте, що виконується лише одна команда echo. Якби це було запущено не один раз, ви, серед іншого, побачили б (iteration beginning)
і (iteration ending)
підрядки надруковані не один раз.
Це означає, що наявність while
циклу тут насправді нічого не досягає. read
Вбудований читає розділених пробілами текст 1 в кожній заданій змінній. Додатковий вхід додається до кінця останньої вказаної змінної. 2 Таким чином , змінні a
і b
приймають значення 1
і , 2
відповідно, в той час як c
приймає значення 3 4 5 6
.
Коли умова циклу ( while read a b c
) оцінюється вдруге, більше немає вхідних даних з труби (ми лише переносимо в неї один рядок тексту), тому read
команда визначає значення false, а не true, і цикл зупиняється (перш ніж виконувати тіло вдруге).
1 : Щоб бути технічна, вбудованої , при передачі власних назв змінних в якості аргументів, зчитує інформацію, розділивши його на окремі «слова» , коли він зустрічає IFS пробільні (дивись також це питання і в цій статті ).read
2 : read
поведінка заклинювання будь-яких додаткових полів введення в останню вказану змінну є спочатку неінтуїтивною для багатьох скрипторів. Це стає легше зрозуміти, коли ти вважаєш, що, як йдеться у відповіді Флоріана Діеша , read
завжди (намагаюся) прочитати цілий рядок - і read
це призначено для використання як із циклом, так і без нього.