2011-08-29 1 views
8

Sto provando a scrivere un piccolo script semplice per interrogare una connessione 3G, e se la connessione è scesa, avviare una riconnessione.Perché il mio confronto tra stringhe bash di due stringhe identiche è sempre falso?

Il mio problema è nel controllare l'output del comando: due stringhe apparentemente uguali non vengono valutate come uguali. Sono sicuro che c'è un errore di noob qui da qualche parte!

#!/bin/bash 

echo "Checking connection" 
a="Not connected." 
b=$(./sakis3g status --console) 

if [[ "$a"!="$b" ]]; then 
    echo "Strings not equal:" 
    echo "$a" 
    echo "$b" 
else 
    echo "Strings equal!!" 
fi 

L'uscita quando eseguito:

[email protected]:~$ ./test_3g.sh 
Checking connection 
Strings not equal: 
Not connected. 
Not connected. 

Quando si esegue ./test_3g.sh | cat -A:

[email protected]:~$ ./test_3g.sh | cat -A 
Checking connection$ 
Strings not equal:$ 
Not connected.$ 
Not connected.$ 
+0

Alla fine non c'è una newline estranea, giusto? – Mehrdad

+2

Prova './test_3g.sh | gatto -A'. Se il tuo 'cat' non supporta l'opzione' -A', prova './test_3g.sh | gatto -v'. –

+0

Non penso ci siano spazi bianchi estranei, ma sarei felice di essere corretto su questo. @ Keith, ho aggiunto l'output dal pipe al cat -A alla domanda. – jozzas

risposta

25

bisogna mettere spazi attorno operatori:

if [[ "$a" != "$b" ]]; then ... 

senza spazi si finisce con una singola stringa, pari a "$a!=$b". E testare solo una stringa restituisce true se quella stringa non è vuota ...

+0

Grazie, sapevo che sarebbe stato un errore noob ... – jozzas

+1

Mi hai battuto per quello di 15 secondi! –

+3

Senza spazi, l'espressione è una singola stringa '" Non connesso.! = Non connesso. "'. Come espressione bash, una stringa viene considerata vera se la sua lunghezza è diversa da zero; '[[STRING]]' è equivalente a '[[-n STRING]]'. ('info bash', cerca' \ [\ [', quindi segui la nota" Bash Conditional Expressions.) –

0

Probabilmente sakis3g messaggio Print programma stderr invece di stdout. In questo caso si confronta il tuo messaggio con una stringa vuota. Provare per reindirizzare stderr su stdout:

b=$(./sakis3g status --console 2>&1) 
+0

No, non l'ho fatto, mi dispiace! Sto ottenendo un risultato memorizzato in 'b' con o senza la tua aggiunta. – jozzas

5

Utilizzare case/esac. Se non devi scherzare con le sfumature nitide di if/else

case "$a" in 
"$b") echo "ok";; 
*) echo "not ok";; 
esac