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.

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.