Вопрос или проблема
Я пытаюсь создать этот скрипт для работы:
#!/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
Пояснения:
- Переменная:
win_location
получает значение из файла с помощьюgrep
иcut
. - Использование двойных кавычек: Команда
sed
использует двойные кавычки, что позволяет интерпретировать переменные и делать подстановку их значений. - Использование альтернативного разделителя в
sed
: Вместо/
в качестве разделителя используется|
. Это помогает избежать проблем, если значение переменной содержит символ/
.
Дополнительные рекомендации:
- Проверка значений переменной: Перед выполнением команды
sed
рекомендуется проверить, не является ли полученное значение пустым. - Резервное копирование: Перед изменением системных файлов, таких как
/etc/default/grub
, сделайте резервную копию оригинала.
Этот профессиональный подход обеспечит корректную работу вашего скрипта, гарантируя, что переменные будут корректно подставлены в текстовые файлы, что особенно критично, когда значения могут содержать пробелы или другие специальные символы.