Различные способы чтения файла в сценарии Bash с использованием цикла while
Эта статья посвящена тому, как читать файлы в сценариях bash с помощью цикла while. Чтение файла — обычная операция в программировании. Вы должны быть знакомы с различными методами и знать, какой из них более эффективен. В bash одну задачу можно решить разными способами, но всегда есть оптимальный способ ее выполнения, и нам следует ему следовать.
Прежде чем узнать, как читать содержимое файла с помощью цикла while, кратко объясним, как работает цикл while. Цикл while оценивает условие и перебирает заданный набор кодов, когда условие истинно.
while [ CONDITION ]
do
code block
done
Давайте разберем синтаксис цикла while.
- цикл while должен начинаться с ключевого слова while, за которым следует условие.
- условие должно быть заключено в [ ] или [[ ]]. Условие всегда должно возвращать true для выполнения цикла.
- Фактический блок кода будет помещен между do и done.
NUMBER=0
while [[ $NUMBER -le 10 ]]
do
echo " Welcome ${NUMBER} times "
(( NUMBER++ ))
done
Это очень простой пример, где цикл выполняется до тех пор, пока NUMBER не станет больше 10, и не печатает оператор echo.
Наряду с while мы будем использовать команду read для чтения содержимого файла построчно. Ниже приведен синтаксис объединения команд while и read. Теперь есть разные способы передать файл в качестве входных данных, и мы их все увидим.
SYNTAX
while read VARIABLE
do
code
done
Трубопроводы в Linux
Обычно мы используем команду cat для просмотра содержимого файла с терминала. Кроме того, мы передадим вывод команды cat другим командам, таким как grep, sort и т. д.
Точно так же мы будем использовать здесь команду cat, чтобы прочитать содержимое файла и передать его в цикл while. Для демонстрации я использую файл /etc/passwd, но не рекомендуется возиться с этим файлом, поэтому сделайте резервную копию этого файла и поиграйте с ним, если хотите.
cat /etc/passwd | while read LREAD
do
echo ${LREAD}
done
Давайте разберем, что произойдет, когда приведенный выше код будет отправлен.
- cat /etc/passwd прочитает содержимое файла и передаст его в качестве входных данных через канал.
- Команда read считывает каждую строку, переданную в качестве входных данных команды cat, и сохраняет ее в переменной LREAD.
- Команда read будет читать содержимое файла до тех пор, пока не будет интерпретирован EOL.
Вы также можете использовать другие команды, такие как head, Tail и передать их в цикл while.
head -n 5 /etc/passwd | while read LREAD
do
echo ${LREAD}
done
Перенаправление ввода в Linux
Мы можем перенаправить содержимое файла в цикл while, используя оператор перенаправления ввода (<)
.
while read LREAD
do
echo ${LREAD}
done < /etc/passwd | head -n 5
Вы также можете сохранить имя файла в переменной и передать его через оператор перенаправления.
FILENAME="/etc/passwd"
while read LREAD
do
echo ${LREAD}
done < ${FILENAME}
Вы также можете передавать имена файлов в качестве аргумента вашего скрипта.
while read LREAD
do
echo ${LREAD}
done < $1 | head -n 5
Внутренний разделитель полей
Вы можете работать с файлами разных типов (CSV, TXT, JSON) и можете разделить содержимое файла по пользовательский разделитель. В этом случае вы можете использовать «Внутренний разделитель полей (IFS)», чтобы разделить содержимое файла и сохранить его в переменных.
Позвольте мне продемонстрировать, как это работает. Взгляните на файл /etc/passwd, в котором в качестве разделителя используется двоеточие (:)
. Теперь вы можете отделить каждое слово из строки и сохранить его в отдельной переменной.
В приведенном ниже примере я разделяю файл /etc/passwd с помощью двоеточия в качестве разделителя и сохраняю каждое разделение в разных переменных.
while IFS=":" read A B C D E F G
do
echo ${A}
echo ${B}
echo ${C}
echo ${D}
echo ${E}
echo ${F}
echo ${G}
done < /etc/passwd
На приведенном выше снимке экрана я отобразил только одну линию, разделенную с учетом размера снимка экрана.
Пустые строки в Linux
Пустые строки не игнорируются при прокручивании содержимого файла. Чтобы продемонстрировать это, я создал образец файла с содержимым ниже. В строке 4 строки и несколько пустых строк, пробелы в начале и в конце, символы табуляции во второй строке и несколько escape-символов (\n и \t).
while read LREAD
do
echo ${LREAD}
done < testfile
Посмотрите результат, пустая строка не игнорируется. Также интересно отметить, как пробелы обрезаются командой read. Простой способ игнорировать пустые строки при чтении содержимого файла — использовать оператор проверки с флагом -z
, который проверяет, равна ли длина строки нулю. Теперь давайте повторим тот же пример, но на этот раз с оператором тестирования.
while read LREAD
do
if [[ ! -z $LREAD ]]
then
echo ${LREAD}
fi
done < testfile
Теперь из вывода вы можете видеть, что пустые строки игнорируются.
Побег Персонажи
Escape-символы, такие как \n
, \t
, \c
, не будут печататься при чтении файла. Чтобы продемонстрировать это, я использую тот же пример файла, в котором мало escape-символов.
while read LREAD
do
echo ${LREAD}
done < testfile
Как видно из выходных escape-символов, они потеряли свое значение и вместо \n
и \t печатаются только n и t.
. Вы можете использовать -r
, чтобы предотвратить интерпретацию обратной косой черты.
while read -r LREAD
do
echo ${LREAD}
done < testfile
Вот и все, что касается этой статьи. Мы будем рады получить от вас какие-либо отзывы или советы. Ваши отзывы помогают нам создавать лучший контент. Продолжайте читать и продолжайте поддерживать.