shell script - vários testes de igualdade em uma declaração if

0

Então eu crio um script e ele funciona perfeito, exceto que no final, quando eu digito uma bebida, ele executa uma linha que não é suposto. A última linha só deve aparecer quando digito "não" ou "não" ... O que fiz de errado?

echo -n "Are you thirsty?"
read th

if [ "$th" = "yes" ] || [ "Yes" ]; then
    echo "What would you like to drink?"
    read th
fi

if [ "$th" = "water" ]; then
    echo "Clear crisp and refreshing."
elif [ "$th" = "beer" ]; then
    echo "Let me see some ID."
elif [ "$th" = "wine" ]; then
    echo "One box or Two?"
else
    echo "Coming right up."
fi

if [ "$th" = "no" ] || [ "No" ]; then
    echo "Come back when you are thirsty."
fi
    
por E. Mart 24.03.2017 / 00:07

3 respostas

3

Seu problema é que [ "Yes" ] e [ "No" ] são equivalentes a [ -n "Yes" ] e [ -n "No" ] e, portanto, sempre são avaliados como verdadeiros.

A sintaxe correta seria:

if [ "$th" = "yes" ] || [ "$th" = "Yes" ]; then
...
if [ "$th" = "no" ] || [ "$th" = "No" ]; then

Ou:

if [ "$th" = "yes" -o "$th" = "Yes" ]; then
...
if [ "$th" = "no" -o "$th" = "No" ]; then

Ou, se você estiver usando bash como um interpretador do shell Bourne:

if [ "${th,,}" = "yes" ]; then
...
if [ "${th,,}" = "no" ]; then

( ${th,,} sendo substituído pelo valor minúsculo da variável th )

    
por 24.03.2017 / 00:26
2

Seus testes não estão fazendo o que você acha que estão fazendo.

if [ "$var" = "value" ] || [ "Value" ];

Isso não faz dois testes de igualdade. Ele verifica o primeiro caso e, em seguida, se isso falhar, verifica se "Value" existe, o que faz, porque está lá para verificar. Por isso, sempre passou para o then correspondente ao if . Você provavelmente quer:

if [ "$var" = value" ] || [ "$var" = "Value" ]

Melhor ainda é olhar para um bloco case..esac :

case "$var" in
    value|Value)
        do_stuff
        ;;
    other|Other)
        do_something_else
        ;;
esac
    
por 24.03.2017 / 00:23
0

(1) Quando você testa [ "Yes" ] e depois [ "No" ] , ainda precisa compará-lo com th em ambas as partes:

[ "$th" = "yes" ] || [ "$th" = "Yes" ]

e

[ "$th" = "no" ] || [ "$th" = "No" ]

(2) Para a seção, if [ "$th" = "yes" ] || [ "$th" = "Yes" ]; , você precisa estender este bloco de código para incluir tudo até o teste de No e usar um elif nesse ponto para combiná-lo como um composto maior% co_de declaração%.

Aqui está com as correções mencionadas acima:

echo -n "Are you thirsty?"
read th

if [ "$th" = "yes" ] || [ "$th" = "Yes" ]; then

    echo "What would you like to drink?"
    read th

    if [ "$th" = "water" ]; then
      echo "Clear crisp and refreshing."
    elif [ "$th" = "beer" ]; then
      echo "Let me see some ID."
    elif [ "$th" = "wine" ]; then
      echo "One box or Two?"
    else
      echo "Coming right up."
    fi

elif [ "$th" = "no" ] || [ "$th" = "No" ]; then
    echo "Come back when you are thirsty."
fi
    
por 24.03.2017 / 06:37