Processando uma resposta Sim / Não do usuário do Bash

11

Isso muito bem pode ser estupidez da minha parte. Gostaria de aceitar respostas Sim / Não, Verdadeiro / Falso no meu script Bash:

test.sh

#!/bin/bash

ARGUMENT=$1

echo User passed in $ARGUMENT

OPTARG=${ARGUMENT:0:1}

if [[ "$OPTARG" -eq 0 ]] || [[ "${OPTARG^^}" == "N" ]]; then
    echo Decline
elif [[ "$OPTARG" -eq 1 ]] || [[ "${OPTARG^^}" == "Y" ]]; then
    echo Accept
else
    echo Invalid argument
fi

Aqui estão alguns exemplos de resultados:

./ test.sh 0

User passed in 0
Decline

./ test.sh 1

User passed in 1
Accept

./ test.sh 2

User passed in 2
Invalid argument

./ test.sh Não

User passed in No
Decline

Agora o stumper. Por que [[ "${OPTARG^^}" == "N" ]] está retornando true para qualquer string!?

./ test.sh Sim

User passed in Yes
Decline

./ test.sh ThisShouldNotMatch

User passed in ThisShouldNotMatch
Decline
    
por i_grok 15.03.2014 / 17:09

3 respostas

10

Isto:

if [[ "$OPTARG" -eq 0 ]] 

Corresponde a qualquer string, a menos que seja apenas dígitos. Use:

if [[ "$OPTARG" == "0" ]] 

Em vez disso.

    
por 15.03.2014 / 17:19
8

Embora o problema em seu código tenha sido bem explicado por goldilocks , não resisto a dizer que seu código é desnecessariamente longo. Você pode simplificá-lo muito.

O seguinte equivale ao seu código desejado:

echo User passed in $1
if [[ "$1" == [nN0]* ]]; then      # First argument starts with either n, N, or 0
    echo Decline
elif [[ "$1" == [yY1]* ]]; then    # First argument starts with either y, Y, or 1
    echo Accept
else
    echo Invalid argument
fi

Você também pode consultar Construções condicionais no manual .

    
por 15.03.2014 / 18:14
6

Você também pode usar case

read -p 'Do you want to Continue (yes/no?): ' 
case $REPLY in
       [yY]|[yY][eE][sS]) echo Accept             ;;
           [nN]|[nN][oO]) echo Decline            ;;
                       *) echo "Invalid argument" ;;
esac
    
por 15.03.2014 / 18:14

Tags