Як я можу порівняти змінну з текстовим рядком, а не цілим числом, у операторі 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 оцінити / порівняти змінну до рядкового вводу, а не цілого числа; під час використання "! =" серед кількох речей, які я спробував, була потрібна інша помилка.

Відповіді:


38

Щось на зразок цього:

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

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


Спасибі. Я спробував це, і сценарій буде звільненим, вимагаючи натискання клавіші, але щойно виявив, що це викликано непов'язаною синтаксичною помилкою далі, тому це спрацювало чудово. Дякую за допомогу.
tony_perkis666

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

4

Цей метод також працював би. Дуже схожа на відповідь @ Гуру, але усуває необхідність у подвійних квадратних дужках.

if [ "$act" == "add" ]
then
echo "Good!"
      else
      echo "Not good!"
fi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.