Я работаю над сценарием 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 )
Дайте мне знать, если вам понадобится другая помощь. Также, пожалуйста, добавьте несколько результатов и, возможно, даже ожидаемых результатов вашего скрипта, чтобы мы могли видеть, где ваша проблема.