Как я могу сравнить переменную с текстовой строкой, а не целым числом, в операторе if / else?

24

В процессе написания сценария оболочки я столкнулся с проблемой следующего оператора if / else, который находится где-то посередине сценария:

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

Возвращаемая ошибка:

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

а затем приступает к остальной части сценария. Как можно, если сегмент if оценивает / сравнивает переменную со строковым вводом, а не с целым числом; при использовании «! =» потребовалась другая ошибка среди нескольких других, которые я пробовал.

tony_perkis666
источник

Ответы:

38

Что-то вроде этого:

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

-eqдля сравнения чисел, используйте =для сравнения строк

Гуру
источник
Благодарю. Я попробовал это, и сценарий освободился, требуя нажатия клавиши, но только что обнаружил, что это было вызвано несвязанной синтаксической ошибкой ниже, так что это сработало отлично. Спасибо за помощь.
tony_perkis666
3
@josephmarhee: Обратите внимание, что [[]]тест является специфической для Bash конструкцией, и этот пример работает с POSIX так же, []как и в вопросе. Если интерпретатор явно указан как #!/bin/bashили похожий, его [[]]можно использовать без проблем (и я полагаю, что он работает немного быстрее, чем альтернатива в Bash - не то, что это все равно должна быть горлышко бутылки), в противном случае следует придерживаться []. Если специфика Bash вообще не нужна, скрипт будет работать немного быстрее, например, в Dash. И POSIX обеспечивает присущую мобильность.
Даниэль Андерссон
4

Этот метод также будет работать. Очень похоже на ответ @ Guru, но устраняет необходимость в двойных квадратных скобках.

if [ "$act" == "add" ]
then
echo "Good!"
      else
      echo "Not good!"
fi
Yokai
источник