/ / Wiele warunków w instrukcji if w bash nie działa - bash, instrukcje warunkowe

Wiele warunków w instrukcji if w bash nie działa - bash, instrukcje warunkowe

Stworzyłem ten mały skrypt bash, aby pobrać dla mnie repozytorium. Jednak jeśli oświadczenie nie ocenia go prawidłowo .... Próbowałem wielu różnych odmian, ale po prostu nie działa.

os=$(lsb_release -si)
version=$(lsb_release -sr)
arch = `getconf LONG_BIT`
if [[$os = "CentOs" && $version >= "6.0" && $arch = "64"]]
then
echo "Works fine"
echo $version
echo $os
fi

Tak jak jako informacja: Obie echo $os & echo $version działa dobrze NA ZEWNĄTRZ instrukcji if.

Aktualizacja: Wyjście bash -x test.sh

++ lsb_release -si
+ os=CentOS
++ lsb_release -sr
+ version=6.4
++ getconf LONG_BIT
+ arch=64
+ [[ CentOS = CentOs ]]

Odpowiedzi:

3 dla odpowiedzi № 1

To:

arch = `getconf LONG_BIT`

powinno być:

arch=`getconf LONG_BIT`

albo lepiej:

arch=$(getconf LONG_BIT)

Nie możesz używać spacji wokół przydziałów w bash. To, co napisałeś, wykonało polecenie o nazwie arch z argumentami = i wyjście z getconf LONG_BIT (prawdopodobnie 32 lub 64).

Musisz również zachować nazwy poleceń (takie jak [[) oddzielnie od argumentów. Musisz to zmienić:

if [[$os = "CentOs" && $version >= "6.0" && $arch = "64"]]

więc ma spacje wokół nazwy "command" (po [[ i przed ]]):

if [[ $os = "CentOs" && $version >= "6.0" && $arch = "64" ]]

Prawdopodobnie zamieściłbym zmienne w podwójnych cudzysłowach, ale nie jest to konieczne w 100%. W takim razie jest problem [[ nie obsługuje <= lub >= operatorów (nikt nie wie, dlaczego nie?). Więc musisz użyć negowanej logiki:

if [[ $os = "CentOs" && ! ($version < "6.0") && $arch = "64" ]]

Bądź ostrożny. Dołącz ! do ($version < "6.0") i dostaniesz "nie znaleziono zdarzenia" (gdybym chciał mieć muszlę morską, idę na brzeg morza, chciałabym, żeby opuściły historyczne zapisy powłoki C z bash).

os=$(lsb_release -si)
version=$(lsb_release -sr)
arch=$(getconf LONG_BIT)
if [[ $os = "CentOs" && ! ($version < "6.0") && $arch = "64" ]]
then
echo "Works fine"
echo "Version $version; OS $os; Arch $arch"
fi

-1 dla odpowiedzi № 2

Aby porównać liczby zmiennoprzecinkowe w Bash, spróbuj wykonać następujące czynności:

- if [[$os = "CentOs" && $version >= "6.0" && $arch = "64"]]
+ if [[ $os = "CentOs" ]] && [[ "$(echo "if (${version} >= 6.0 1 else 0" | bc)" -eq 1 ]] && [[ $arch = "64" ]]

Widzieć: Jak porównać dwie liczby dziesiętne w bash / awk?