Чтение и запись файлов с помощью Bash
Изучите различные способы чтения и записи данных в Bash и когда использовать каждый метод.
Когда вы пишете скрипты с помощью Bash, иногда вам нужно прочитать данные из файла или записать их в файл. Иногда файл может содержать параметры конфигурации, а иногда файл представляет собой данные, которые ваш пользователь создает с помощью вашего приложения. Каждый язык решает эту задачу по-своему, и в этой статье показано, как обрабатывать файлы данных с помощью Bash и других оболочек POSIX.
Установить Баш
Если вы используете Linux, возможно, у вас уже есть Bash. Если нет, вы можете найти его в своем репозитории программного обеспечения.
В macOS вы можете использовать терминал по умолчанию: Bash или Zsh, в зависимости от используемой версии macOS.
В Windows существует несколько способов работы с Bash, включая официально поддерживаемую Microsoft подсистему Windows для Linux (WSL).
После установки Bash откройте свой любимый текстовый редактор и приготовьтесь писать код.
Чтение файла с помощью Bash
Bash — это не только оболочка, но и язык сценариев. Существует несколько способов чтения данных из Bash: вы можете создать своего рода поток данных и проанализировать выходные данные или загрузить данные в память. Оба являются допустимыми методами получения информации, но каждый из них имеет довольно специфические случаи использования.
Исходный файл в Bash
Когда вы «источник» файла в Bash, вы заставляете Bash читать содержимое файла, ожидая, что он содержит действительные данные, которые Bash может вписать в свою установленную модель данных. Вы не будете получать данные из какого-либо старого файла, но можете использовать этот метод для чтения файлов конфигурации и функций.
Например, создайте файл с именем example.sh
и введите в него следующее:
#!/bin/sh
greet opensource.com
echo "The meaning of life is $var"
Запустите код, чтобы увидеть его сбой:
$ bash ./example.sh
./example.sh: line 3: greet: command not found
The meaning of life is
В Bash нет команды greet
, поэтому он не может выполнить эту строку, и в нем нет записи о переменной с именем var
, поэтому неизвестно значение жизнь. Чтобы решить эту проблему, создайте файл с именем include.sh
:
greet() {
echo "Hello ${1}"
}
var=42
Измените сценарий example.sh
, включив в него команду source
:
#!/bin/sh
source include.sh
greet opensource.com
echo "The meaning of life is $var"
Запустите скрипт, чтобы увидеть его работу:
$ bash ./example.sh
Hello opensource.com
The meaning of life is 42
Команда greet
переносится в вашу среду оболочки, поскольку она определена в файле include.sh
и даже распознает аргумент (opensource.com
в этом примере). Переменная var
также устанавливается и импортируется.
Разобрать файл в Bash
Другой способ передать данные «в» Bash — проанализировать их как поток данных. Есть много способов сделать это. Вы можете использовать grep
или cat
или любую команду, которая принимает данные и передает их на стандартный вывод. Альтернативно вы можете использовать то, что встроено в Bash: перенаправление. Само по себе перенаправление не очень полезно, поэтому в этом примере я также использую встроенную команду echo
для вывода результатов перенаправления:
#!/bin/sh
echo $( < include.sh )
Сохраните это как stream.sh
и запустите, чтобы увидеть результаты:
$ bash ./stream.sh
greet() { echo "Hello ${1}" } var=42
$
Для каждой строки в файле include.sh
Bash печатает (или отображает) строку на вашем терминале. Предварительная передача данных соответствующему парсеру — распространенный способ чтения данных с помощью Bash. Например, предположим на мгновение, что include.sh
— это файл конфигурации с парами ключей и значений, разделенными знаком равенства (=
). Вы можете получить значения с помощью awk
или даже cut
:
#!/bin/sh
myVar=`grep var include.sh | cut -d'=' -f2`
echo $myVar
Попробуйте запустить скрипт:
$ bash ./stream.sh
42
Запись данных в файл с помощью Bash
Независимо от того, храните ли вы данные, созданные вашим пользователем с помощью вашего приложения, или просто метаданные о том, что пользователь делал в приложении (например, сохранения игр или недавно сыгранные песни), существует множество веских причин хранить данные для последующего использования. В Bash вы можете сохранять данные в файлы, используя общее перенаправление оболочки.
Например, чтобы создать новый файл, содержащий выходные данные, используйте один токен перенаправления:
#!/bin/sh
TZ=UTC
date > date.txt
Запустите скрипт несколько раз:
$ bash ./date.sh
$ cat date.txt
Tue Feb 23 22:25:06 UTC 2021
$ bash ./date.sh
$ cat date.txt
Tue Feb 23 22:25:12 UTC 2021
Чтобы добавить данные, используйте токены двойного перенаправления:
#!/bin/sh
TZ=UTC
date >> date.txt
Запустите скрипт несколько раз:
$ bash ./date.sh
$ bash ./date.sh
$ bash ./date.sh
$ cat date.txt
Tue Feb 23 22:25:12 UTC 2021
Tue Feb 23 22:25:17 UTC 2021
Tue Feb 23 22:25:19 UTC 2021
Tue Feb 23 22:25:22 UTC 2021
Bash для простого программирования
Bash отличается простотой изучения, поскольку, имея всего лишь несколько базовых понятий, вы можете создавать сложные программы. Полную документацию можно найти в превосходной документации Bash на GNU.org.