Чарли Мартин дает вам хорошее объяснение и объяснение того, что пошло не так с вашим конкретным примером, но не отвечает на общий вопрос:
Когда следует использовать команду чтения?
Ответ на этот вопрос таков: когда вы хотите прочитать последовательные строки из какого-либо файла (вполне возможно, стандартный вывод некоторой предыдущей последовательности команд в конвейере), возможно, разбив строки на несколько отдельных переменных. Разделение выполняется с использованием текущего значения '$IFS
', что обычно означает на пробелах и вкладках (в этом контексте новые строки не учитываются; они разделяют строки). Если в команде чтения несколько переменных, то первое слово входит в первую переменную, второе во вторую, ... и остаток строки в последнюю переменную. Если есть только одна переменная, вся строка переходит в эту переменную.
Есть много применений. Это один из более простых сценариев, который у меня есть, использующий параметр split:
#!/bin/ksh
#
# @(#)$Id: mkdbs.sh,v 1.4 2008/10/12 02:41:42 jleffler Exp $
#
# Create basic set of databases
MKDUAL=$HOME/bin/mkdual.sql
ELEMENTS=$HOME/src/sqltools/SQL/elements.sql
cat <<! |
mode_ansi with log mode ansi
logged with buffered log
unlogged
stores with buffered log
!
while read dbs logging
do
if [ "$dbs" = "unlogged" ]
then bw=""; cw=""
else bw="-ebegin"; cw="-ecommit"
fi
sqlcmd -xe "create database $dbs $logging" \
$bw -e "grant resource to public" -f $MKDUAL -f $ELEMENTS $cw
done
Команда cat
с здесь-документом отправляет свои выходные данные в канал, поэтому выходные данные переходят в цикл while read dbs logging
. Первое слово входит в $dbs
и является именем базы данных (Informix), которую я хочу создать. Остальная часть строки помещается в $ logging. Тело цикла имеет дело с незарегистрированными базами данных (где begin
и commit
не работают), затем запускает программу sqlcmd
(полностью отделенную от новичка Microsoft с тем же именем; она существует примерно с 1990 года). ) создать базу данных и заполнить ее некоторыми стандартными таблицами и данными - имитацией таблицы Oracle 'dual
' и набором таблиц, связанных с таблицей элементов.
Другие сценарии, использующие команду read
, больше (на сегодняшний день), но обычно читают строки, содержащие одно или несколько имен файлов и некоторые другие релевантные атрибуты, а затем применяют соответствующее преобразование к файлам с использованием атрибутов.
Osiris JL: file * | grep 'sh.*script' | sed 's/:.*//' | xargs wgrep read
esqlcver:read version letter
jlss: while read directory
jlss: read x || exit
jlss: read x || exit
jlss: while read file type link owner group perms
jlss: read x || exit
jlss: while read file type link owner group perms
kb: while read size name
mkbod: while read directory
mkbod:while read dist comp
mkdbs:while read dbs logging
mkmsd:while read msdfile master
mknmd:while read gfile sfile version notes
publictimestamp:while read name type title
publictimestamp:while read name type title
Osiris JL:
'Osiris JL:' - это приглашение моей командной строки; Я запустил это в моем каталоге 'bin'. 'wgrep
' - это вариант grep, который соответствует только целым словам (чтобы избежать таких слов, как «уже»). Это дает некоторое представление о том, как я его использовал.
Строки 'read x || exit
' предназначены для интерактивного сценария, который читает ответ от стандартного ввода, но завершается, если команда получает EOF (например, если стандартный ввод поступает из /dev/null
).