/ / Condizioni multiple in un'istruzione if in bash non funziona - bash, istruzioni condizionali

Condizioni multiple in un'istruzione if in bash non funziona - bash, dichiarazioni condizionali

Ho creato questo piccolo script bash per scaricare repository per me. Comunque se la dichiarazione non la valuta correttamente .... Ho provato molte varianti diverse ma non funzionano.

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

Proprio come informazioni: entrambi echo $os & echo $version funziona bene ESTERNO se le dichiarazioni.

Aggiornamento: output di bash -x test.sh

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

risposte:

3 per risposta № 1

Questo:

arch = `getconf LONG_BIT`

dovrebbe essere:

arch=`getconf LONG_BIT`

o meglio:

arch=$(getconf LONG_BIT)

Non puoi usare spazi attorno ai compiti in bash. Quello che hai scritto ha eseguito un comando chiamato arch con argomenti = e l'output di getconf LONG_BIT (presumibilmente 32 o 64).

È inoltre necessario mantenere i nomi dei comandi (come ad esempio [[) separato dagli argomenti, in generale. Quindi, è necessario modificare questo:

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

quindi ha spazi attorno al nome del "comando" (dopo il [[ e prima del ]]):

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

Probabilmente racchiudere le variabili tra virgolette, ma non è necessario il 100%. Poi c'è il problema [[ non supporta il <= o >= operatori (qualcuno sa perché no?). Quindi, devi usare la logica negata:

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

Stai attento. Allegare il ! al ($version < "6.0") e ottieni "evento non trovato" (se volessi una conchiglia di mare, andrei in riva al mare, vorrei che lasciassero le notazioni storiche della shell di C fuori dal 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 per risposta № 2

Per confrontare i numeri in virgola mobile in Bash, prova quanto segue:

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

Vedere: Come confrontare due numeri decimali in bash / awk?