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

Вопрос или проблема

Я пытаюсь создать этот скрипт для работы:

#!/bin/bash
win_location=$(cat /boot/grub/grub.cfg | grep 'class windows' | cut -d "'" -f2)
sudo sed -i 's/^'GRUB_DEFAULT='.*$/GRUB_DEFAULT="$win_location"/' /etc/default/grub
sudo update-grub2

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

Есть идеи?

Заранее благодарю

Если вы хотите использовать переменные в sed, пожалуйста, используйте двойные кавычки вместо одиночных

Как в вашем примере, у вас есть переменные в sed

sudo sed -i "s|^GRUB_DEFAULT=.*$|GRUB_DEFAULT=\"$win_location\"|g" /etc/default/grub

Ответ или решение

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

Ваша изначальная задача состояла в том, чтобы извлечь значение из файла /boot/grub/grub.cfg и использовать его для изменения файла /etc/default/grub. Это значение извлекается из строки с помощью grep и cut, а затем это значение должно быть использовано в команде sed. Проблема заключалась в том, что вы использовали одиночные кавычки при определении команды sed, что привело к тому, что переменная $win_location не была подставлена в строку.

Что нужно исправить

Ваш исходный код выглядел так:

win_location=$(cat /boot/grub/grub.cfg | grep 'class windows' | cut -d "'" -f2)
sudo sed -i 's/^'GRUB_DEFAULT='.*$/GRUB_DEFAULT="$win_location"/' /etc/default/grub
sudo update-grub2

Ключевая ошибка — использование одиночных кавычек в команде sed. Одиночные кавычки предотвращают интерпретацию переменных, тем самым приводя к отсутствию подстановки переменной $win_location.

Исправленный код

Необходимо заменить одиночные кавычки на двойные в команде sed. Это позволит интерпретировать переменные:

#!/bin/bash
win_location=$(grep 'class windows' /boot/grub/grub.cfg | cut -d "'" -f2)
sudo sed -i "s|^GRUB_DEFAULT=.*$|GRUB_DEFAULT=\"$win_location\"|g" /etc/default/grub
sudo update-grub2

Пояснения:

  1. Переменная: win_location получает значение из файла с помощью grep и cut.
  2. Использование двойных кавычек: Команда sed использует двойные кавычки, что позволяет интерпретировать переменные и делать подстановку их значений.
  3. Использование альтернативного разделителя в sed: Вместо / в качестве разделителя используется |. Это помогает избежать проблем, если значение переменной содержит символ /.

Дополнительные рекомендации:

  • Проверка значений переменной: Перед выполнением команды sed рекомендуется проверить, не является ли полученное значение пустым.
  • Резервное копирование: Перед изменением системных файлов, таких как /etc/default/grub, сделайте резервную копию оригинала.

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

Оцените материал
Добавить комментарий

Капча загружается...