
Я работаю над скриптом 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
решение1
Я думаю, что ваша проблема может заключаться в некоторых проблемах со сравнением чисел с плавающей точкой и строк.
Насколько мне известно, тест не может работать со значениями с плавающей точкой, поэтому ваш тест для $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)
Это обрезает вывод my /etc/debian_version
, который был 7.8
до и 7
после добавления cut
.
Вы также можете захотеть отключить предупреждения для несуществующих файлов. У меня нет доступной системы RedHat, поэтому я перенаправил сообщения об ошибках из первых двух команд вот /dev/null
так:
value1=$(cat /etc/redhat-release 2> /dev/null | awk '{ print $4 }' | cut -c 1 )
Дайте мне знать, если вам нужна какая-либо другая помощь. Также, пожалуйста, добавьте некоторые выходные данные и, возможно, даже ожидаемые выходные данные вашего скрипта, чтобы мы могли увидеть, в чем ваша проблема.