Найти в Дзене
LITVINOV-UPGRADE-LINUX

Bash-типовые примеры работы с файлами

Bash (Bourne Again SHell) — это командный интерпретатор (shell) и язык командных файлов (скриптов) для операционных систем семейства Unix и Linux. Рассмотрим несколько конструкций, которые часто применяются в скриптах. Например создание ярлыка: EXEC_PATH="/opt/Telegram/Telegram" DESKTOP_PATH="$HOME/Desktop/Telegram.desktop" # Создание ярлыка cat <<EOF > "$DESKTOP_PATH" [Desktop Entry] Version=1.0 Type=Application Name=Telegram Exec=$EXEC_PATH Terminal=false Categories=Network;InstantMessaging; EOF chmod 700 "$DESKTOP_PATH" Например, с проверкой есть ли уже подобная строка в файле .bashrc Если нужно чтобы в файл записалось именно ${HOME} то экранируем косой чертой "\", получим \${HOME} grep -qxF 'export PATH=\${HOME}/opt/binutils-${_ver}/bin:$PATH' ~/.bashrc || \ echo 'export PATH=\${HOME}/opt/binutils-${_ver}/bin:$PATH' >> ~/.bashrc source ~/.bashrc Пример без проверки на повторы 2>&1 - В результате оба потока (stdout и stderr) попадут в один файл ${OUT_FN_PREFIX}-test.txt Скрипт чит
Оглавление

Bash (Bourne Again SHell) — это командный интерпретатор (shell) и язык командных файлов (скриптов) для операционных систем семейства Unix и Linux.

Рассмотрим несколько конструкций, которые часто применяются в скриптах.

1. Запись строк в файл.

Например создание ярлыка:

EXEC_PATH="/opt/Telegram/Telegram"
DESKTOP_PATH="$HOME/Desktop/Telegram.desktop"
# Создание ярлыка
cat <<EOF > "$DESKTOP_PATH"
[Desktop Entry]
Version=1.0
Type=Application
Name=Telegram
Exec=$EXEC_PATH
Terminal=false
Categories=Network;InstantMessaging;
EOF
chmod 700 "$DESKTOP_PATH"

2. Запись одной строки в файл.

Например, с проверкой есть ли уже подобная строка в файле .bashrc

Важно:

  • > (одиночный знак больше) перезаписывает файл, удаляя его предыдущее содержимое.
  • >> (двойной знак больше) добавляет (аппендит) новые данные в конец файла, не удаляя его содержимое.

Заметка:

Если нужно чтобы в файл записалось именно ${HOME} то экранируем косой чертой "\", получим \${HOME}

Пример:

grep -qxF 'export PATH=\${HOME}/opt/binutils-${_ver}/bin:$PATH' ~/.bashrc || \
echo 'export PATH=\${HOME}/opt/binutils-${_ver}/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

3. Запись строк в файл.

Пример без проверки на повторы

Заметка:

2>&1 - В результате оба потока (stdout и stderr) попадут в один файл ${OUT_FN_PREFIX}-test.txt

Важно:

Скрипт читаем справа налево, сначала перенаправление stdout и stderr в файл, потом перезапись файла.

make test > ${OUT_FN_PREFIX}-test.txt 2>&1;

Пример записи в файлы требующими права администратора.

echo "${PREFIX_DIR}/${ZLIB}/lib" | sudo tee /etc/ld.so.conf.d/${ZLIB}.conf;
sudo ldconfig;

Чтоб записать этим способом несколько строк

echo -e "/home/astra/opt/OSG-3.6.5/lib\n/home/astra/opt/OSG-3.6.5/lib64" | sudo tee /etc/ld.so.conf.d/OSG365.conf
  • echo -e позволяет интерпретировать escape-последовательности, такие как \n для перевода строки.
  • \n используется для разделения строк

4. Обновление строки в файле.

# Обновляем версию в файле control
sed -i "s/Version: [0-9]\+\.[0-9]\+\.[0-9]\+-[0-9]\+/Version: $NEW_VERSION/" "$CONTROL_FILE"

Заметка:

  • sed -i — это утилита для потокового редактирования текста. (-i - in-place) редактирует на месте без создания временной копии.
  • Version: [0-9]\+\.[0-9]\+\.[0-9]\+-[0-9]\+ - Шаблон замены.
  • $NEW_VERSION - строка на замену
  • $CONTROL_FILE - путь к файл.

5. Чтение строки.

Например чтение строки из файла с версией.

Заметка:

  • head — команда для вывода первых строк файла. (head -n 1) - только первая строка
  • $(...) - подстановка команд (command substitution), которая позволяет использовать вывод команды как значение переменной
VERSION_FILE="${CURRENT_DIR}/version"
# Проверяем, существует ли файл версии
if [[ ! -f "$VERSION_FILE" ]]; then echo "Файл $VERSION_FILE не найден."; exit 1; fi
# Читаем новую версию из файла
NEW_VERSION=$(head -n 1 "$VERSION_FILE")

Надеюсь, что кому-то эта шпаргалка будет полезна.