Bash чтение переменной из файла

Обновлено: 30.06.2024

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

После гигантского предыдущего раздела этот пройти намного проще.

Попросите пользователя ввести данные

Если мы хотим попросить пользователя ввести данные, мы используем команду read. Эта команда принимает ввод и сохраняет его в переменной.

Давайте рассмотрим простой пример:

introduction.sh

Давайте разберем:

  • Строка 4. Печатает сообщение, запрашивающее у пользователя ввод данных.
  • Строка 6. Запустите команду чтения и сохраните ответ пользователя в переменной varname.
  • Строка 8. Повторите еще одно сообщение, чтобы убедиться, что команда чтения сработала. Примечание. Мне пришлось поставить обратную косую черту ( \ ) перед ', чтобы он был экранирован.
  1. ./introduction.sh
  2. Здравствуйте, с кем я разговариваю?
  3. Райан
  4. Приятно познакомиться, Райан.
  • Примечание: Райан выше выделен курсивом только для того, чтобы показать, что это было то, что я набрал. На вашем терминале ввод будет отображаться нормально.

Подробнее с функцией чтения

Вы можете изменить поведение чтения с помощью различных параметров командной строки. (См. справочную страницу для чтения, чтобы увидеть их все.) Однако обычно используются две опции: -p, которая позволяет указать подсказку, и -s, которая делает ввод беззвучным. Это может упростить запрос комбинации имени пользователя и пароля, как в примере ниже:

логин.sh

  • В строках 4 и 5 выше мы заключаем подсказку в кавычки, чтобы добавить к ней пробел. В противном случае пользовательский ввод начнется сразу после последнего символа подсказки, что не идеально с точки зрения удобочитаемости.
  1. ./login.sh
  2. Имя пользователя: райан
  3. Пароль:
  4. Спасибо, Райан, теперь у нас есть ваши данные для входа

Дополнительные переменные

До сих пор мы рассматривали одно слово в качестве входных данных. Однако мы можем сделать больше.

cars.sh

  1. ./cars.sh
  2. Какие автомобили вам нравятся?
  3. Ягуар Мазерати Бентли
  4. Вашей первой машиной был Jaguar.
  5. Ваша вторая машина: Maserati.
  6. Ваша третья машина: Bentley.
  7. ./cars.sh
  8. Какие автомобили вам нравятся?
  9. Ягуар Мазерати Бентли Лотус
  10. Вашей первой машиной был Jaguar.
  11. Ваша вторая машина: Maserati.
  12. Ваша третья машина: Bentley Lotus.

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

Чтение из стандартного ввода

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

Bash поддерживает передачу и перенаправление с помощью специальных файлов. Каждый процесс получает свой собственный набор файлов (по одному для STDIN, STDOUT и STDERR соответственно), и они связываются при вызове конвейера или перенаправления. Каждый процесс получает следующие файлы:

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

  • STDIN — /dev/stdin или /proc/self/fd/0
  • STDOUT — /dev/stdout или /proc/self/fd/1
  • STDERR — /dev/stderr или /proc/self/fd/2

fd в приведенных выше путях означает файловый дескриптор.

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

резюме

Давайте разберем:

  • Строки 4, 5, 6 — вывести заголовок вывода.
  • Строка 8: укажите файл, представляющий STDIN, обрежьте, установив разделитель на пробел, поля 2 и 3, затем отсортируйте вывод.
  1. cat salesdata.txt
  2. Яблоки Fred 20 4 марта
  3. Сьюзи Апельсинс 5 7 марта
  4. Отметить арбузы 12 10 марта
  5. Махровые персики 7 15 марта
  6. cat salesdata.txt | ./резюме
  7. Вот сводка данных о продажах:
  8. ====================================
  9. яблоки 20
  10. 5 апельсинов
  11. персики 7
  12. арбузы 12

Так что же мне использовать?

Теперь у нас есть 3 метода для получения ввода от пользователя:

  • Аргументы командной строки
  • Чтение ввода во время выполнения скрипта
  • Принимать данные, которые были перенаправлены в скрипт Bash через стандартный ввод.

Какой метод лучше, зависит от ситуации.

По возможности следует отдавать предпочтение аргументам командной строки. Они наиболее удобны для пользователей, так как данные будут храниться в их истории команд, чтобы они могли легко вернуться к ней. Это также лучший подход, если ваш сценарий может вызываться другими сценариями или процессами (например, вы хотите, чтобы он периодически запускался с использованием CRON).

Иногда характер данных таков, что было бы не идеально хранить их в историях команд людей и т. д. Хорошим примером этого являются учетные данные для входа (имя пользователя и пароль). В таких случаях лучше читать данные во время выполнения скрипта.

Если все, что делает скрипт, — это обрабатывает данные определенным образом, то, вероятно, лучше всего работать со STDIN. Таким образом, его можно легко добавить в конвейер.

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

В конечном счете, при принятии решения о том, как пользователи будут предоставлять данные для вашего сценария Bash, вам следует учитывать 3 фактора:

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

Обзор

read varName Чтение ввода пользователя и сохранение его в переменной varName. /dev/stdin Файл, который вы можете прочитать, чтобы получить STDIN для скрипта Bash

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

Предположим, у вас есть файл с именем company.txt, который содержит названия компаний. Этот файл содержит следующее содержимое.

Пример -1: Чтение содержимого файла из командной строки

Предположим, вы хотите прочитать файл company.txt построчно из командной строки без команды «cat». Выполните следующую команду, чтобы выполнить задачу. Цикл while будет читать каждую строку из файла company.txt на каждом шаге и сохранять содержимое строки в переменной $line, которая будет напечатана позже.


Пример 2. Чтение содержимого файла с помощью скрипта

Создайте файл bash и добавьте следующий код для чтения содержимого определенного файла. Здесь существующее имя файла хранится в переменной $filename, а переменная $n используется для хранения значения номера строки этого файла. Как и в предыдущем примере, цикл while используется для чтения этого файла с номером строки.

Выполните следующую команду, чтобы выполнить скрипт.

Выполните команду cat с файлом company.txt, чтобы отобразить исходное содержимое файла company.txt.


Пример -3: Передача имени файла из командной строки и чтение файла

Создайте файл bash и добавьте следующий скрипт. Этот скрипт возьмет имя файла из аргумента командной строки. Значение первого аргумента считывается переменной $1, которая будет содержать имя файла для чтения. Если файл существует в текущем местоположении, то цикл while будет читать файл построчно, как в предыдущем примере, и печатать содержимое файла.

Запустите приведенный выше скрипт с файлом employee.txt в качестве значения аргумента. Вывод покажет содержимое файла employee.txt, удалив лишнее пространство. Вы можете показать исходное содержимое файла employee.txt с помощью команды «cat».


Пример – 4. Чтение файла с пропуском обратной косой черты

Если вы хотите прочитать каждую строку файла, опуская обратную косую черту, вам нужно использовать параметр «-r» с командой чтения в цикле while.

Создайте файл с именем company2.txt с обратной косой чертой и выполните следующую команду, чтобы выполнить сценарий. В выводе будет показано содержимое файла без обратной косой черты.


Вам потребуется прочитать файл для многих целей программирования.Например, вы можете легко искать или сопоставлять любой конкретный контент из любого файла, читая каждую строку отдельно. Таким образом, это важная задача для любого программирования. В этом руководстве показаны несколько простых примеров чтения файла в сценарии bash. Это поможет вам получить представление о чтении содержимого файла построчно, используя цикл while в сценарии bash, и более эффективно применять его в вашем сценарии. Для получения дополнительной информации смотрите видео!

Об авторе

Фахмида Есмин

Я веду курсы веб-программирования. Мне нравится писать статьи или учебные пособия на различные темы в области ИТ. У меня есть канал на YouTube, на котором публикуются различные учебные пособия по Ubuntu, Windows, Word, Excel, WordPress, Magento, Laravel и т. д.: Справка Tutorials4u.

Если у вас есть несколько лет опыта работы с экосистемой Linux и вы хотите поделиться этим опытом с сообществом, ознакомьтесь с нашими Правилами участия.

1. Обзор

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

2. Использование эхо

Один из способов записи содержимого переменных в файл — использование команды echo вместе с оператором перенаправления.

Начнем с простой команды Bash:

Это создает переменную $my_var, записывает ее в файл file.log с помощью echo, а затем выводит содержимое файла для проверки. :

В команде echo мы используем двойные кавычки вокруг $my_var, чтобы избежать случая, когда echo интерпретирует содержимое строки как аргументы. Например, запустим:

Мы видим следующий вывод:

В этом случае аргумент -e применяется к вызову echo и не отправляется в виде вывода в файл. Таким образом, мы видим только «некоторое значение».

Еще одна вещь, которую мы должны отметить, это то, что по умолчанию echo помещает символ новой строки в конец ввода.

3. Использование printf

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

Изменение наших команд сверху:

Мы видим следующий вывод:

Однако, если мы хотим, чтобы этот вывод совпадал с выводом echo, нам нужно добавить \n после $myvar. Это связано с тем, что printf по умолчанию не добавляет новую строку. После добавления новой строки содержимое переменной находится в отдельной строке:

4. здесь Строки

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

Давайте попробуем:

Здесь мы устанавливаем $my_var в строку. Используя строку здесь, мы затем отправляем пользовательскую строку, содержащую переменную, в cat. В-третьих, мы направляем вывод cat в выходной файл через >. Наконец, мы снова используем cat, чтобы увидеть полное содержимое переменной в файле:

5. Заключение

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

Если у вас есть несколько лет опыта работы с экосистемой Linux и вы хотите поделиться этим опытом с сообществом, ознакомьтесь с нашими Правилами участия.

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

Прежде чем вы узнаете, как читать содержимое файла с помощью цикла while, кратко изучите, как работает цикл while. Цикл while оценивает условие и выполняет итерацию по заданному набору кодов, когда условие истинно.

Давайте разберем синтаксис цикла while.

  • цикл while должен начинаться с ключевого слова while, за которым следует условие.
  • Условие должно быть заключено в [ ] или [[ ]]. Условие всегда должно возвращать истину для выполнения цикла.
  • Фактический блок кода будет помещен между do и done.

Это очень простой пример, в котором цикл выполняется до тех пор, пока NUMBER не станет больше 10, и печатает оператор эха.

Наряду с while мы будем использовать команду чтения для чтения содержимого файла построчно.Ниже приведен синтаксис того, как комбинируются команды while и read. Теперь есть разные способы передать файл в качестве входных данных, и мы увидим их все.

Конвейер в Linux

Обычно мы будем использовать команду cat для просмотра содержимого файла из терминала. Кроме того, мы будем передавать вывод команды cat другим командам, таким как grep, sort и т. д.

Аналогично здесь мы будем использовать команду cat для чтения содержимого файла и передачи его в цикл while. Для демонстрации я использую файл /etc/passwd, но не рекомендуется возиться с этим файлом, поэтому сделайте резервную копию этого файла и поэкспериментируйте с ним, если хотите.

Трубопроводы в Linux

Давайте разберем, что произойдет, когда приведенный выше код будет отправлен.

  • cat /etc/passwd прочитает содержимое файла и передаст его в качестве входных данных по конвейеру.
  • команда read считывает каждую строку, переданную в качестве входных данных командой cat, и сохраняет ее в переменной LREAD.
  • команда read будет читать содержимое файла до тех пор, пока не будет интерпретирован EOL.

Вы также можете использовать другие команды, такие как head, tail, и передавать их в цикл while.

Head Command

Перенаправление ввода в Linux

Мы можем перенаправить содержимое файла в цикл while с помощью оператора перенаправления ввода ( .

Перенаправление ввода

Вы также можете сохранить имя файла в переменной и передать его через оператор перенаправления.

Сохранить имя файла в переменной

Вы также можете передавать имена файлов в качестве аргумента скрипту.

Сохранить имя файла в качестве аргумента

Внутренний разделитель полей

Вы можете работать с различными типами форматов файлов (CSV, TXT, JSON) и можете разделить содержимое файла на основе пользовательского разделителя. В этом случае вы можете использовать «Внутренний разделитель полей (IFS)», чтобы разделить содержимое файла и сохранить его в переменных.

Позвольте мне продемонстрировать, как это работает. Взгляните на файл /etc/passwd, в котором в качестве разделителя используется двоеточие (:). Теперь вы можете отделить каждое слово от строки и сохранить его в отдельной переменной.

В приведенном ниже примере я разбиваю файл /etc/passwd с помощью двоеточия в качестве разделителя и сохраняю каждое разделение в разные переменные.

Внутренний разделитель полей

С учетом размера снимка экрана на приведенном выше снимке экрана была разделена только одна строка.

Пустые строки в Linux

Пустые строки не игнорируются при циклическом просмотре содержимого файла. Чтобы продемонстрировать это, я создал образец файла с приведенным ниже содержимым. Есть 4 строки и несколько пустых строк, начальные пробелы, конечные пробелы, символы табуляции в строке 2 и некоторые escape-символы (\n и \t).

Файл с Пустые строки
Пустая строка не игнорируется

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

Пустые строки игнорируются

Теперь из вывода видно, что пустые строки игнорируются.

Экран-символы

Управляющие символы, такие как \n , \t , \c , не будут печататься при чтении файла. Чтобы продемонстрировать это, я использую тот же пример файла, в котором мало escape-символов.

Файл с Экранирующие символы
Escape Character в Linux

Из вывода видно, что escape-символы потеряли свое значение, и вместо \n и \t печатаются только n и t . Вы можете использовать -r для предотвращения интерпретации обратной косой черты.

Предотвратить интерпретацию обратной косой черты

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

Если вам понравилась эта статья, подпишитесь на уведомления по электронной почте о руководствах по Linux. Если у вас есть вопросы или сомнения? обратитесь за помощью в разделе комментариев.

Если вы цените то, что мы делаем здесь, в TecMint, вам следует подумать о следующем:

TecMint – это самый быстрорастущий и пользующийся наибольшим доверием сайт сообщества, где можно найти любые статьи, руководства и книги по Linux в Интернете. Миллионы людей посещают TecMint! для поиска или просмотра тысяч опубликованных статей, доступных всем БЕСПЛАТНО.

Если вам нравится то, что вы читаете, купите нам кофе (или 2) в знак признательности.

Поддержите нас

Мы благодарны за вашу бесконечную поддержку.

Похожие записи

SSH вход без пароля

Разрыв и Заявления о продолжении

Использовать до цикла в Ваши сценарии оболочки

 Используйте Heredoc в сценариях Bash

 Получение файла в сценарии оболочки

 Изучите разницу между $ и $BASHPID в Bash

Есть что сказать? Присоединяйтесь к обсуждению. Отменить ответ

Этот сайт использует Akismet для уменьшения количества спама. Узнайте, как обрабатываются данные ваших комментариев.

Читайте также: