Поиск по сайту:

Различные способы чтения файла в сценарии 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

Вот и все, что касается этой статьи. Мы будем рады получить от вас какие-либо отзывы или советы. Ваши отзывы помогают нам создавать лучший контент. Продолжайте читать и продолжайте поддерживать.