Jak mogę porównać zmienną do ciągu tekstowego zamiast liczby całkowitej w instrukcji if / else?

24

Podczas pisania skryptu powłoki napotkałem problem z następującą instrukcją if / else, która znajduje się gdzieś w środku skryptu:

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

Błąd powrotu to:

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

a następnie przechodzi do dalszej części skryptu. Jak mogę sprawić, aby segment if oceniał / porównywał zmienną z wejściem ciągu, a nie liczbą całkowitą; inny błąd był wymagany przy użyciu „! =” spośród kilku innych rzeczy, które próbowałem.

tony_perkis666
źródło

Odpowiedzi:

38

Coś takiego:

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

-eqsłuży do porównania liczb, użyj =do porównania ciągów

Guru
źródło
Dzięki. Próbowałem tego, a skrypt zwolniłby, wymagając naciśnięcia klawisza, ale właśnie odkryłem, że jest to spowodowane niepowiązanym błędem składniowym w dalszej części, więc działało idealnie. Dzięki za pomoc.
tony_perkis666
3
@josephmarhee: Zauważ, że [[]]test jest konstrukcją specyficzną dla Bash, a ten przykład działa równie dobrze z POSIX-em []użytym w pytaniu. Jeśli interpreter jest jawnie podany jako #!/bin/bashlub podobny, [[]]można go używać bez problemów (i sądzę, że jest to nieco szybsze niż alternatywa w Bash - nie, że i tak powinien być szyjką butelki), w przeciwnym razie należy się trzymać []. Jeśli w ogóle nie potrzebujesz specyfikacji Bash, skrypt będzie działał nieco szybciej, np. W Dash. A POSIX zapewnia wewnętrzną przenośność.
Daniel Andersson
4

Ta metoda również działałaby. Bardzo podobny do odpowiedzi @ Guru, ale eliminuje potrzebę stosowania podwójnych nawiasów kwadratowych.

if [ "$act" == "add" ]
then
echo "Good!"
      else
      echo "Not good!"
fi
Jokai
źródło