Не помещайте команды в квадратные скобки.
Чтобы выполнить цикл, пока grep
завершился успешно (т. Е. Пока он не завершился), просто выполните
, пока grep ...
do
︙ {{1} } done
Чтобы выполнить цикл, пока grep
не работает (т. е. до тех пор, пока он не завершится успешно), выполните
while! grep ...
do
︙
done
с пробелами (т. е. одним или несколькими пробелами и / или табуляцией)
между !
и команда.
Вы всегда должны цитировать ссылки на переменные оболочки (например, "$ path"
)
, если у вас нет веской причины не делать этого,
и вы уверены, что знаете, что делаете.
В отличие от фигурных скобок,
они не так важны, как кавычки ,
поэтому "$ text"
и "$ path"
достаточно хороши
(вам не нужно использовать "$ {text}"
и "$ {path}"
, в этом контексте).
… если путь
не может быть установлен в список имен файлов, в этом случае см.
Последствия для безопасности, если вы забыли указать переменную в кавычках в bash / POSIX shells
- Но что, если…?
Вам не нужна точка с запятой (;
) в конце строки , а
{{1} } (если вы не поставите после него do
).
Другими словами, строка , а
и do
должны быть разделены
точкой с запятой и / или одним или несколькими новые строки.
Сценарий считывает пары строк из двух файлов. На каждой итерации он считывает строку из file11
в lineA
и из file22
в lineB
. Он делает это до тех пор, пока не встретит конец любого файла. Тело цикла выводит две строки и пустую строку.
<file11
означает «подключить/перенаправить стандартный ввод из file11
в эту команду», где «эта команда» — это цикл while
. Это также могло быть написано 0<file11
.
Стандартным вводом является файловый дескриптор номер 0. Файловые дескрипторы 1 и 2 зарезервированы для стандартного вывода и стандартных потоков ошибок.
3<file22
означает «подключить файловый дескриптор 3 к file22
для этой команды». Число 3 является следующим «свободным» номером файлового дескриптора, но в коде вместо этого можно было использовать 4 или 5 или любое небольшое целое число, отличное от 0, 1 и 2 (ограничение количества используемых файловых дескрипторов зависит от того, что используется оболочка, но гарантированно работают числа до 9 ).
В цикле read lineA
будет читать строку из стандартного ввода по умолчанию, т.е. из файлаfile11
(стандартный ввод наследуется от цикла ). Это также могло быть написано read lineA <&0
.
С помощью read lineB <&3
команда read
читает из дескриптора файла 3, т.е.из file22
, а не из стандартного ввода (дескриптор файла 3 доступен в цикле, точно так же, как стандартный ввод ).
Вкратце, он использует стандартный входной поток и «дополнительный» файловый дескриптор (номер 3 )для чтения из двух файлов «одновременно» (строки за раз из каждого файла по очереди ). Обычно у пользователя есть доступ только к одному входному потоку , но это обходит это ограничение, явно создавая второй входной поток и подключая его к файлу file22
.
Связанные:
Я использую слово «строка» выше, а не «строка». В вещах, прочитанных из двух файлов, будут удалены пробелы по бокам, а некоторые escape-последовательности будут интерпретированы особым образом.
Чтобы прочитать строку с помощью read
, используйте
IFS= read -r varname
Связанные: