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

Чтение и запись файлов с помощью 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.

Статьи по данной тематике: