Назад | Перейти на главную страницу

Bash Script для установки ОС Linux

Я работаю над сценарием bash и столкнулся с проблемой. Я использую то, что знаю, используя обычные операторы if / fi, и пытаюсь использовать их для установки переменных, связанных с выбором версии ОС, таких как RH 7, Debian 7, Ubuntu и т. Д. У меня проблема в том, что это просто не работает, как я думал. Я запускаю каждую часть вручную, и она отлично работает, но когда я помещаю все в сценарий, ничего.

Есть лучший способ сделать это? заранее спасибо

value1=$(cat /etc/redhat-release | awk '{ print $4 }' | cut -c 1)
value2=$(cat /etc/redhat-release | awk '{ print $3 }' | cut -c 1)
value3=$(lsb_release -sr)
value4=$(cat /etc/debian_version)
if [[ $value1 -eq 7 ]] && [[ -e /etc/redhat-release ]]; then
        OS=RedHat
        VER=RH7
elif [[ $value2 -eq 6 ]] && [[ -e /etc/redhat-release ]]; then
        OS=RedHat
        VER=RH6
elif [[ $value3 = 14.04 ]]; then
        OS=Ubuntu
        VER=UB1404
elif [[ -e /etc/debian_version ]] && [[ $value4 -eq 7 ]]; then
        OS=Debian
        VER=DEB7
fi

Я думаю, что ваша проблема может заключаться в некоторых проблемах со сравнением поплавков и строк.
AFAIK, тест не может иметь дело со значениями с плавающей запятой, поэтому ваш тест для $value3 = 14.04 даст вам syntax error: invalid arithmetic operator (error token is ".04").

Вы можете просто рассматривать числа как строку следующим образом:
elif [[ "$value3" == "14.04" ]]; then
Также обратите внимание на цитаты вокруг $value3, что также необходимо для лечения 7.8, который был возвращен в моем случае с debian 7.8 как строка.

Если вы хотите сравнить только номер основной версии, вы также можете удалить часть после точки:
value3=$(lsb_release -sr | cut -d. -f1)
Это разделит строку, возвращаемую lsb_release -sr на . который мы определили как разделитель с -d. параметр, а затем выберите первый столбец результата с помощью -f1.
Это также работает со значением 4:
value4=$(cat /etc/debian_version | cut -d. -f1)
Это сокращает вывод моих /etc/debian_version который был 7.8 раньше и 7 после добавления cut.

Вы также можете отключить предупреждения о несуществующих файлах. У меня нет доступной системы redhat, поэтому я перенаправил сообщения об ошибках из первых двух команд на /dev/null как это:
value1=$(cat /etc/redhat-release 2> /dev/null | awk '{ print $4 }' | cut -c 1 )

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