Como posso comparar uma variável a uma sequência de texto, em vez de inteiro, em uma instrução if / else?

24

No processo de escrever um script de shell, deparei-me com a seguinte instrução if / else que fica em algum lugar no meio do script:

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

O erro retornado é:

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

e depois prossegue com o restante do script. Como posso fazer com que o segmento if avalie / compare a variável com uma entrada de string em vez de um número inteiro; um erro diferente foi necessário ao usar "! =" entre outras coisas que tentei.

tony_perkis666
fonte

Respostas:

38

Algo assim:

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

-eqé para comparação de números, use =para comparação de strings

Guru
fonte
Obrigado. Eu tentei isso, e o script seria liberado, exigindo um pressionamento de tecla, mas acabei de descobrir que foi causado por um erro de sintaxe não relacionado mais adiante, portanto, isso funcionou perfeitamente. Obrigado pela ajuda.
precisa saber é o seguinte
3
@ Josephphmarhee: Observe que o [[]]teste é uma construção específica do Bash, e este exemplo funciona tão bem com o POSIX []quanto usado na pergunta. Se o intérprete é explicitamente dado como #!/bin/bashou similar, ele [[]]pode ser usado sem problemas (e é um pouco mais rápido que a alternativa no Bash , acredito - não que seja um gargalo de qualquer maneira), caso contrário, deve-se ficar com ele []. Se alguém não precisar de detalhes específicos sobre o Bash, o script será executado um pouco mais rápido, por exemplo, no Dash. E o POSIX garante portabilidade inerente.
Daniel Andersson
4

Este método também funcionaria. Muito semelhante à resposta do @ Guru, mas elimina a necessidade de colchetes duplos.

if [ "$act" == "add" ]
then
echo "Good!"
      else
      echo "Not good!"
fi
Yokai
fonte