Як обробляти лінію файлу за рядка в сценарії Bash Linux

Feb 3, 2025
Linux,
Fatmawati Achmad Zaenuri / Shutterstock

Це досить легко прочитати вміст лінії текстового файлу Linux за рядком у сценаріїв, якщо ви маєте справу з деякими тонками gotchas. Ось як зробити це безпечним способом.

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

Кожна мова програмування має набір ідіом. Це стандартні, безлічі способи здійснення набору загальних завдань. Вони є елементарним або за замовчуванням спосіб використання однієї з особливостей мови програміст працює. Вони стають частиною інструментарію програміста психічних креслень.

Дії, такі як читання даних з файлів, працюють з петлями, а також переміщення значень двох змінних - хороші приклади. Програміст буде знати, принаймні один спосіб досягти своїх кінців у загальній або ванілійній моді. Можливо, це буде достатньо для вимоги під рукою. Або, можливо, вони прикрашають код, щоб зробити його більш ефективним або застосовним до конкретного рішення, який вони розвиваються. Але маючи будівельний блок ідіома на їхніх пальцях - це чудова відправна точка.

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

Лінії читання з файлу: один-лайнер

У Баш, ви можете використовувати a поки петля на командному рядку, щоб прочитати кожен рядок тексту з файлу і зробити щось з ним. Наш текстовий файл називається "data.txt". Він утримує список місяців року.

 Січень
Лютий
Березня
.
.
Жовтень
Листопад
Грудень 

Наш простий One-Liner:

 під час читання; робити лінію echo $; зроблено & lt; data.txt 

Точний поки Цикл читає лінію з файлу, а потік виконання невеликої програми переходить до тіла петлі. Точний ехо Команда записує лінію тексту в термінальному вікні. Спроба читання не працює, коли немає більше рядків, щоб бути прочитані, а цикл робиться.

Один акуратний трюк - це здатність Щоб перенаправити файл у петлю . На інших мовах програмування, вам потрібно буде відкрити файл, читати з неї, і закрити його знову, коли ви закінчите. Завдяки Bash, ви можете просто використовувати перенаправлення файлів і нехай оболонка обробляє всі речі для вас низького рівня.

Звичайно, це одно-лайнер не дуже корисний. Linux вже надає кішка Команда, що робить саме для нас. Ми створили довготривалий спосіб замінити команду з трьох букв. Але це видно демонструє принципи читання з файлу.

Що працює досить добре, до точки. Припустимо, у нас є інший текстовий файл, який містить імена місяців. У цьому файлі послідовність втечі для нового рядка була додана до кожного рядка. Ми називаємо це "data2.txt".

 січня \ n
Лютий \ n
Березень \ n
.
.
Жовтень \ n
Листопад \ n
Грудень \ n 

Давайте використовувати наш новий лайнер на нашому новому файлі.

 під час читання; робити лінію echo $; зроблено & lt; data2.txt 

Характер з боку зворотного складу " \ T - відкинуто. Результат полягає в тому, що для кожного рядка додано "n". Баш тлумачить зворотну слеш як початок Послідовність втечі . Часто ми не хочемо баш, щоб тлумачити те, що він читає. Це може бути більш зручним для читання рядків у своїй повільній відстані в евакуації та все-і вибрати, що, щоб розібрати або замінити себе в свій власний код.

Якщо ми хочемо зробити будь-яку значущу обробку або розбір на лінії тексту, нам потрібно буде використовувати скрипт.

Лінії читання з файлу з сценарієм

Ось наш сценарій. Це називається "Script1.sh".

    #! / Bin / bash  
 
  Лічильник =  0 
 
  Хоча   IFS =   ''   Читати   -R   LineFromfile  [116 ] ||   [  -N   "  $ {linefromfile}  "  ]] ]    
 
  (  Лічильник   ++  ))  
  Echo   "Доступ до лінії   $ Лічильник  :   $ {LineFromFile}  " [9 ] 
 
  зроблено   & lt;   "  $ 1  "    

Ми встановлюємо змінну Лічильник до нуля, то ми визначаємо наші поки петля.

Перша заява на лінії в той час як IFS = '' . IFS виступає за внутрішній роздільник полів. Він має значення, що Bash використовує для ідентифікації кордонів слів. За замовчуванням для читання команди відсікає початкові і кінцеві пробіли. Якщо ми хочемо, щоб читати рядки з файлу точно так, як вони, ми повинні встановити IFS щоб бути символом нового рядка.

Ми могли б встановити цей раз поза циклом, так само, як ми встановлюємо значення Лічильник . Але з більш складними сценаріями, особливо ті з великою кількістю функцій, що визначаються користувачем в них, цілком можливо, що IFS можуть бути встановлені різні значення в іншому місці в сценарії. Забезпечення того, щоб IFS встановлюється в порожній рядок кожного разу, коли в поки цикл перебирає гарантує, що ми знаємо, що його поведінка буде.

Ми будемо читати рядок тексту в змінну з ім'ям ЛініяFROMFile . ми використовуємо -r (Читай зворотної косої межі як звичайний символ) варіант ігнорування зворотної косої межі. Вони будуть ставитися так само, як будь-який інший символ і не отримають ніякого спеціального лікування.

Є дві умови, які будуть задовольняти поки петлі і дозволяють текст, який буде опрацьовано тілом циклу:

  • читання -r LinefromFile Коли рядок тексту успішно лічені з файлу, прочитати Команда посилає сигнал успіху в поки і поки цикл проходить потік виконання в тілі циклу. Зверніть увагу, що прочитати Команда повинна побачити символ нового рядка в кінці рядка тексту для того, щоб вважати його успішним для читання. Якщо файл не є POSIX сумісний текстовий файл, то останній рядок не може містити символ нового рядка . якщо прочитати команда бачить кінець файлу маркер (EOF) перед рядком завершується символом нового рядка, він буде не розглядати його як успішне читання. Якщо це станеться, то останній рядок тексту не буде передана в тіло циклу і не буде оброблена.
  • [-N "$ {LinefromFile}"] Ми повинні зробити деяку додаткову роботу, щоб впоратися з не-POSIX сумісних файлів. Це порівняння перевіряє текст, який зчитується з файлу. Якщо він не завершується символом нового рядка, це порівняння буде повертати успіх до поки петля. Це гарантує, що будь-які кінцеві фрагменти лінії обробляються тілом циклу.

Ці два положення відокремлені один від одного або логічного оператора » || »Так що якщо або Успіх застереження повертається, витягнутий текст обробляється тіло циклу, чи є символ нового рядка чи ні.

У тілі нашого циклу ми приріст Лічильник змінна одним і використовуючи ехо послати деякий висновок у вікні терміналу. Відображаються номер рядка і текст кожного рядка.

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

Скопіюйте та вставте цей скрипт в редакторі і збережіть його з ім'ям «script1.sh.» Використовувати хмод командування щоб зробити його виконуваним .

 CHMOD + х script1.sh 

Давайте подивимося, що наш сценарій робить з текстового файлу data2.txt і зворотні косі, що містяться в ньому.

 ./ script1.sh data2.txt 

Кожен символ в рядку відображається дослівно. Зворотні косі рис чи інтерпретуються як екранують символи. Вони друкуються як звичайні символи.

Передача лінії в функції

Ми все ще просто повторюємо текст на екран. У реальному сценарізі програмування, ми, ймовірно, будемо робити щось цікавіше з лінією тексту. У більшості випадків це хороша практика програмування для обробки подальшої обробки лінії в іншій функції.

Ось як ми могли це зробити. Це "script2.sh".

Ми визначаємо нашу Лічильник змінну, як і раніше, і тоді ми визначаємо цю функцію process_line () . Визначення функції має з'явитися раніше Функція вперше називається скриптом.

Наша функція буде передана новонародженим рядком тексту в кожній ітерації поки петля. Ми можемо отримати доступ до цього значення в межах функції за допомогою використання $ 1 змінну. Якщо існує дві змінні до функції, ми можемо отримати доступ до цих значень $ 1 і $ 2 , і так далі для більш змінних.

W потік петля в основному однакова. Існує лише одна зміна всередині тіла петлі. Точний ехо Лінія була замінена закликом до process_line () функція. Зауважте, що вам не потрібно використовувати кронштейни "()" під час назви функції, коли ви телефонуєте.

Назва змінної, що тримає лінію тексту, ЛініяFROMFile , загорнута в лапки, коли вона передається до функції. Це супроводжує рядки, які мають в них пробіли. Без лапки, перше слово розглядається як $ 1 за функцією, друге слово вважається $ 2 , і так далі. Використання лапки гарантує, що вся лінія тексту обробляється, як це $ 1 . Зауважте, що це не так само $ 1 що утримує той самий файл даних, переданий до скрипту.

Тому що Лічильник було оголошено в основному корпусі сценарію, а не всередині функції, його можна посилатися всередині process_line () функція.

Скопіюйте або введіть сценарій над редактором та збережіть його з файлом "Script2.sh". Зробити це виконуваним хмод :

 chmod + x script2.sh 

Тепер ми можемо запустити його та передати в новому файлі даних, "data3.txt". У цьому є список місяців, і один рядок з багатьма словами на ньому.

 Січень
Лютий
Березня
.
.
Жовтень
Листопад \ nmore Текст "Наприкінці лінії"
Грудень 

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

 ./ script2.sh data3.txt 

Лінії читаються з файлу і пройшли один за одним до process_line () функція. Всі лінії відображаються правильно, включаючи незвичайний з backspace, лапки та декілька слів у ньому.

Будівельні блоки корисні

Там є потяг думки, що говорить, що ідіома повинна містити щось унікальне для цієї мови. Це не віра, що я підписуюся. Важливим є те, що він робить добре використання мови, легко запам'ятати, і забезпечує надійний і надійний спосіб для реалізації деяких функцій в вашому коді.


Linux, - Найпопулярніші статті

What’s New in Debian 11 “Bullseye”

Linux, Jul 22, 2025

Дебіан , попередник багатьох інших дистрибутивів Linux, зробив випуск 11 доступних на етапі тестува�..


Native Gaming на Linux Можливо вмирання, і це добре

Linux, Sep 27, 2025

DC Studio / Shutterstock.com Точний Парова колода , Оголошено в серпні 2021 року, має Linux Gaming Circles,..


Цей новий Linux Gaming Laptop Має Спекуляції на Run Anything

Linux, Oct 20, 2025

Комп'ютери JUNO Linux і ігри починають об'єднатися набагато більше. Точний Парова колода з�..


Ubuntu 21.10 прибуває з Customized GNOME Desktop 40

Linux, Oct 14, 2025

Ubuntu Якщо ви unbuntu, або хтось, хто думає про те, щоб дати йому спробу, сьогодні є хороший день. Canoni..


10 Основні команди Linux для початківців

Linux, Oct 13, 2025

Просто почати роботу на Linux? Створення себе комфортно з командним рядком має важливе значення. Якщо ви �..


Що таке Unix Epoch, і як Unix Час роботи?

Linux, Nov 10, 2024

Михайло Леонов / Shutterstock Unix зберігає час як кількість секунд, що пройшли з 1 січня 1970 року..


Як перелічити змінні середовища на Linux

Linux, Oct 31, 2025

У Linux змінні середовища мають важливі значення та налаштування. Сценарії, програми та оболонки читають ці..


Як встановити статичну IP -адресу в Ubuntu

Linux, Oct 17, 2025

Ваша домашня мережа покладається на IP -адреси на маршрутні дані між пристроями, а іноді і на повторне з'єд�..


Категорії