Г-н. Ответ Шаллера хорош. Недостатком перенаправления ввода из файла является то, что ваш ручной ввод теперь также зависит от цикла, поэтому пользователи должны будут знать, что нужно нажать Enter (не вводить значение), чтобы завершить цикл. Вы можете использовать свою текущую логику для ручных запусков и сделать что-то вроде ниже, когда есть входной файл ($ 1), предоставленный скрипту (не перенаправленный).
Если вы уверены, что формат файла всегда будет "имя\номер\n", то вы можете сделать:
cntr=0
cat $1 | while read line
do
if [ $cntr -eq 0 ]
then
name=$line
cntr=1
elif [ $cntr -eq 1 ]
number=$line
echo "Your name is $name and your number is $number"
cntr=0
fi
done
Это должно печатать ваше утверждение до тех пор, пока не будут прочитаны все комбинации имя/число.
Поведение разделителя записей и полей может быть установлено в определенных программах, таких как awk
, и редко выполняется с помощью переменных среды. Обычные утилиты, такие как cat
, не имеют такого типа функций: только документированные программы (например, cut
) имеют возможности использования различных разделителей записей или полей.
awk
является наиболее гибким из упомянутых, с переменными, которые могут быть установлены как для записей, так и для разделителей полей:
FS
Регулярное выражение разделителя полей ввода; aпо умолчанию.
OFS
Разделитель полей вывода печатного оператора;по умолчанию.
ORS
Разделитель записей вывода печатного оператора; aпо умолчанию.
RS
Первый символ строкового значенияRS
должен быть разделителем входных записей; aпо умолчанию. Если
RS
содержит более одного символа, результаты не указаны. ЕслиRS
равно null, то записи разделяются последовательностями, состоящими изплюс одна или несколько пустых строк, начальные или конечные пустые строки не должны приводить к пустым записям в начале или конце входных данных, а
всегда должен быть разделителем полей, независимо от значения
FS
.
Вы можете установить эти переменные в скрипте, например, ,
awk ' BEGIN { RS=" "; } { print; }' < inputfile
для печати каждого слова файла в новой строке. Вы также можете назначить любую переменную с помощью опции -v
:
awk -v RS=" " '{ print; }' < inputfile
Наконец, awk
также имеет опцию -F
(разделитель полей ввода), которая совпадает с переменной FS
.
Дальнейшее чтение:
Если вас интересует только замена символов, вы можете взглянуть на утилиту tr
(что означает «перевод»). Например, чтобы преобразовать символы новой строки в пробелы, вы можете использовать:
tr '\n' ' ' < your_input_file
Аналогично, чтобы перевести пробелы в новые строки, используйте:
tr ' ' '\n' < your_input_file
Обратите внимание, что tr
читает из stdin
, поэтому вам нужно либо использовать перенаправление ввода ( <
), как я сделал в этих примерах, или перенаправить туда свой ввод (используя |
).