Come posso confrontare una variabile con una stringa di testo, anziché un numero intero, in un'istruzione if / else?


24

Nel processo di scrittura di uno script di shell, ho riscontrato un problema con la seguente istruzione if / else che si trova da qualche parte nel mezzo dello script:

if [ $act -eq "add" ]
then
    read - "add or update: " $comm
    git commit -m "$comm $file"
else
    git commit -m "$act $file"
fi

L'errore di ritorno è:

./gitup: line 13: [: add: integer expression expected

e quindi procede con il resto della sceneggiatura. Come posso avere il segmento if valutare / confrontare la variabile con un input di stringa anziché con un numero intero; è stato richiesto un errore diverso quando ho usato "! =" tra un paio di altre cose che ho provato.

Risposte:


38

Qualcosa come questo:

act="add"
if [[ $act = "add" ]]
then
    echo good
else
    echo not good
fi

-eqè per il confronto dei numeri, usare =per il confronto delle stringhe


Grazie. L'avevo provato, e lo script si sarebbe liberato, richiedendo una sequenza di tasti, ma ho appena scoperto che era causato da un errore di sintassi non correlato più in basso, quindi ha funzionato perfettamente. Grazie per l'aiuto.
tony_perkis666,

3
@josephmarhee: si noti che il [[]]test è un costrutto specifico di Bash e questo esempio funziona altrettanto bene con POSIX []come utilizzato nella domanda. Se l'interprete è esplicitamente dato come #!/bin/basho simile, [[]]può essere usato senza problemi (ed è un po 'più veloce dell'alternativa in Bash , credo - non che dovrebbe essere comunque un collo di bottiglia), altrimenti uno dovrebbe attenersi []. Se uno non ha affatto bisogno di specifiche di Bash, lo script verrà eseguito un po 'più velocemente, ad esempio in Dash. E POSIX garantisce la portabilità intrinseca.
Daniel Andersson,

4

Questo metodo funzionerebbe anche. Molto simile alla risposta di @ Guru, ma elimina la necessità di parentesi quadre doppie.

if [ "$act" == "add" ]
then
echo "Good!"
      else
      echo "Not good!"
fi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.