Как обработать файловую строку по строке в сценарии Binux Bash

Feb 3, 2025
Linux,
Fatmawati Achmad Zaenuri / Shutterstock

Довольно легко прочитать содержимое линейки текстового файла Linux по строке в скрипте оболочки - до тех пор, пока вы имеете дело с некоторыми тонкими Gotchas. Вот как сделать это безопасным способом.

Файлы, текст и идиомы

Каждый язык программирования имеет набор идиом. Это стандартные, не являются излишественными способами для достижения набора общих задач. Они элементарные или по умолчанию для использования одной из особенностей языка, с которыми работает программист. Они становятся частью инструментария программиста психических предписаний.

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

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

Линии чтения из файла: одноклассник

В Bash вы можете использовать в то время как Структура в командной строке, чтобы прочитать каждую строку текста из файла и сделать что-то с ним. Наш текстовый файл называется «data.txt». Он содержит список месяцев года.

 январь
Февраль
Март
Отказ
Отказ
Октябрь
Ноябрь
Декабрь 

Наш простой одноклассник:

 во время чтения строки; Do Echo $ Line; сделано data.txt 

То в то время как Корпус читает линию из файла, а поток выполнения маленькой программы пропускается к корпусу цикла. То эхо Команда записывает линию текста в окне терминала. Попытка чтения не удается, когда больше нет линий, которые нужно прочитать, и цикл выполняется.

Один аккуратный трюк - это способность перенаправить файл в петлю Отказ На других языках программирования вам нужно будет открыть файл, прочитать из него, и закройте его снова, когда вы закончите. С Bash вы можете просто использовать перенаправление файлов и позвольте оболочку обрабатывать все эти низкоуровневые вещи для вас.

Конечно, этот одноклассник не является ужасно полезным. Linux уже предоставляет Кот Команда, которая делает именно для нас. Мы создали долговечный способ заменить трехбуквенную команду. Но это видимо продемонстрирует принципы чтения из файла.

Это работает достаточно хорошо, до точки. Предположим, у нас есть другой текстовый файл, который содержит имена месяцев. В этом файле escape Sequence для новой строки был добавлен к каждой строке. Мы назовем это "data2.txt."

 январь \ n
Февраль \ N.
Март \ н
Отказ
Отказ
Октябрь \ N.
Ноябрь \ N.
Декабрь \ N 

Давайте будем использовать наш одноклассник в нашем новом файле.

 во время чтения строки; Do Echo $ Line; сделано data2.txt 

Бегущий персонаж обратной слашлы \ "Был отбран. Результатом заключается в том, что «N» был добавлен к каждой строке. Bash интерпретирует обратную косание как начало escape Sequence. Отказ Часто мы не хотим, чтобы убить толковать то, что это читает. Может быть удобнее прочитать строку в своих целых последовательностях Escape AsceSsslash и все и выбирает, что разбирать или заменить себя в собственном коде.

Если мы хотим сделать какую-либо значимую обработку или расставание на линии текста, нам нужно будет использовать скрипт.

Линии чтения из файла со скриптом

Вот наш скрипт. Это называется «Script1.sh».

    #! / BIN / BASH  
 
  счетчик =  0 
 
  В то время как   IfS =   ''   чтение   -R   LineFromFile   [116 ] ||   [[[  -N     «  $ {linelomfile}  "  ] ];   делают  
 
  (  счетчик   ++  ))  
  ECHO   «Линия доступа   $ Counter  :   $ {LineFromFile}  » [9 ] 
 
  Сделано   « «   $ 1   «   

Мы устанавливаем переменную под названием Прилавок до нуля, то мы определяем наши в то время как петля.

Первое утверждение на то время IFS = '' ' Отказ IFS. Стенды для внутреннего сепаратора поля. Он содержит значения, которые Bash использует для определения границ слов. По умолчанию команда чтения положивает лидирующие и трейливые пробелы. Если мы хотим прочитать строки из файла именно так, как они есть, нам нужно установить IFS. быть пустой строкой.

Мы могли бы установить это один раз за пределами цикла, как мы устанавливаем значение Прилавок Отказ Но с более сложными скриптами - особенно те, которые со многими пользовательскими функциями в них - это возможно, что IFS. может быть установлен на разные значения в другом месте в скрипте. Обеспечение IFS. установлен в пустую строку каждый раз в то время как петля ITERATE гарантирует, что мы знаем, что будет его поведение.

Мы собираемся прочитать линию текста в переменную под названием LineFromFile. Отказ Мы используем (Прочитайте обратную чехлу как нормальный символ) опция, чтобы игнорировать обратные касля. Они будут относиться как к любому другому характеру и не получит какое-либо особое лечение.

Есть два условия, которые будут удовлетворять в то время как петля и позволить тексту обрабатывать телом петли:

  • Read -R LineFromFile. : Когда линия текста успешно читается из файла, читать Команда отправляет сигнал успеха на в то время как и то в то время как Корпус проходит выполнение потока к корпусу цикла. Обратите внимание, что то читать команда должна видеть новенький характер В конце линии текста, чтобы рассмотреть это успешное чтение. Если файл не является Поставка Соответствует текстовому файлу, Последняя строка может не включать новенький характер Отказ Если то читать Команда видит конец файла маркера (EOF) до того, как линия будет прекращена новой линией, она будет нет Относитесь к этому как успешное чтение. Если это произойдет, последняя строка текста не будет передана корпусу цикла и не будет обработана.
  • [-N "$ {linefromfile}"] : Нам нужно сделать дополнительную работу для обработки файлов несовместимых файлов не POSIX. Это сравнение проверяет текст, который читается из файла. Если оно не прекращено новым характером, это сравнение все равно будет возвращать успех к в то время как петля. Это гарантирует, что любые фрагменты задней линии обрабатываются организмом цикла.

Эти два пункта разделены или логичным оператором » || «Так что если или Пункт возвращает успех, восстановленный текст обрабатывается телом цикла, независимо от того, есть ли новенький характер или нет.

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

Мы все еще можем использовать наш трюк перенаправления для перенаправления файла в петлю. В этом случае мы перенаправляем 1 доллар, переменная, которая удерживает имя первого параметра командной строки, которая передавала скрипту. Используя этот трюк, мы можем легко передать имя файла данных, на которые мы хотим, чтобы сценарий работать.

Скопируйте и вставьте скрипт в редактор и сохраните его с именем файла «Script1.sh». Использовать камин команда Чтобы сделать его исполняемым Отказ

 Chmod + X Script1.sh 

Давайте посмотрим, что наш скрипт делает текстовый файл data2.txt, и обратные кашию, содержащиеся внутри него.

 ./ Script1.sh data2.txt 

Каждый символ в линии отображается Verbatim. Вершинные капли не интерпретируются как эвакуирующие символы. Они напечатаны как обычные персонажи.

Передача линию к функции

Мы все еще просто повторяем текст на экран. В сценарии реального программирования мы могли бы сделать что-то более интересное с линейкой текста. В большинстве случаев это хорошая практика программирования для обработки дальнейшей обработки линии в другой функции.

Вот как мы могли это сделать. Это «Script2.sh».

Мы определяем наше Прилавок переменная как раньше, а затем мы определяем функцию под названием Process_line () Отказ Определение функции должно появиться до Функция впервые вызывается в скрипте.

Наша функция будет передана вновь чтение текста в каждой итерации в то время как петля. Мы можем получить доступ к этому значению в функции, используя 1 доллар Переменная. Если в функцию передавали две переменные, мы могли бы получить доступ к этим значениям, используя 1 доллар а также 2 доллара и так далее для большего количества переменных.

W. хил петля в основном одинакова. В корпусе цикла есть только одно изменение. То эхо линия была заменена призовом к Process_line () функция. Обратите внимание, что вам не нужно использовать кронштейны «()» в названии функции, когда вы его называете.

Имя переменной удерживания линейки текста, LineFromFile. , завернут в кавычки, когда она передается функции. Это обслуживает для линий, которые имеют пробелы в них. Без кавычек первое слово рассматривается как 1 доллар по функции, второе слово считается 2 доллара , и так далее. Использование кавычек гарантирует, что вся линия текста обрабатывается, в целом, как 1 доллар Отказ Обратите внимание, что это нет такой же 1 доллар который содержит тот же файл данных, переданный скрипту.

Потому что Прилавок был объявлен в основной части сценария, а не внутри функции, его можно ссылаться внутри Process_line () функция.

Скопируйте или введите скрипт выше в редактор и сохраните его с именем файла «Script2.sh». Сделать его исполняемым камин :

 chmod + x script2.sh 

Теперь мы можем запустить его и пройти в новом файле данных, «Data3.txt». Это имеет список месяцев в нем и одна строка со многими словами на нем.

 январь
Февраль
Март
Отказ
Отказ
Октябрь
Ноябрь \ Nmore Text "В конце линии"
Декабрь 

Наша команда:

 ./ Script2.sh data3.txt 

Линии читаются из файла и передавали один на один к Process_line () функция. Все линии отображаются правильно, включая нечетную с Backspace, кавычки, и в нем несколько слов.

Строительные блоки полезны

Существует поезд мыслей, который говорит, что идиома должна содержать что-то уникальное для этого языка. Это не вера, на которую я подпишусь. Что важно, так это то, что он хорошо использует язык, легко запомнить, и обеспечивает надежный и надежный способ реализации некоторых функций в вашем коде.


Linux, - Самые популярные статьи

Как заблокировать свой Mac с помощью терминала

Linux, Feb 16, 2025

Одним из первых правил кибербезопасности является всегда заблокировать ваш компьютер, прежде чем вы�..


Как использовать расширение скобки в раковине BASH Linux

Linux, May 12, 2025

Fatmawati Achmad Zaenuri / Shutterstock Расширение Brace - это полезная техника для генерации списков строк..


Как скрыть все значки рабочего стола на Mac

Linux, Jun 23, 2025

Крисда / Shutterstock Ваш Mac Desktop беспорядок? Не хочу все организовать? Не волнуйтесь, вы может�..


Docker для начинающих: Все, что нужно знать

Linux, Jun 15, 2025

Докер создает упакованные приложения называется контейнерами. Каждый контейнер обеспечив�..


Как обновить Arch Linux

Linux, Jul 30, 2025

Проект Ubuntu Пришло время обновить свою систему Arch Linux? Будь вы на чистой арке или в арке ..


Что нового в Ubuntu 21.10 'Impish Indri'

Linux, Oct 14, 2025

Канонический Ubuntu 21.10 "Согласил indri" было выпущенный 14 октября 2021 года. Это особенно�..


Как установить Linux на M1 Mac с Apple Silicon

Linux, Nov 11, 2024

Новая поддержка Linux для новой архитектуры на основе Apple еще не готова, но вы можете запустить Linux на M1..


Как найти PID процесса Linux с Pidof или PGREP

Linux, Nov 15, 2024

Работа с процессом Linux часто означает знание его идентификатора процесса или PID. Это уникальное число, дан..


Категории