Isto:
if [[ "$OPTARG" -eq 0 ]]
Corresponde a qualquer string, a menos que seja apenas dígitos. Use:
if [[ "$OPTARG" == "0" ]]
Em vez disso.
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
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 .
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
Tags bash