Bash: nenhuma saída do loop while e alguma solução melhor?

Bash: nenhuma saída do loop while e alguma solução melhor?

Sou novo em scripts bash e a parte do meu script abaixo não me fornece nenhuma saída.

check=""
while [ "$check"=="" ]
do
    read -p "Signature Correct?(Yes/No): " check

if [ "$check" != "Y" || "$check" != "y" || "$check" != "Yes" || "$check" != "yes" || "$check" != "N" || "$check" != "n" || "$check" != "No" || "$check" != "no" ];
then
    check=""
elif ["$check" == "Y" || "$check" == "y" || "$check" == "Yes" || "$check" == "yes" ];
then
    echo "Signature Accepted!"
elif [ "$check" != "N" || "$check" != "n" || "$check" != "No" || "$check" != "no" ];
then
    check=""
fi
done

Não recebo nenhuma mensagem de erro. Alguma ajuda com isso? Se você tiver uma solução mais inteligente ou mais curta, ficarei grato em me beneficiar do conhecimento.

Obrigado!

Responder1

Sugestão:

#!/bin/bash

while true; do
    read -p 'Is signature correct? y/[n]: '

    [[ $REPLY == [Yy]* ]] && break

    echo 'Ok, asking again...'
done

echo 'Signature accepted'

Isso implementa um loop infinito do qual o usuário interrompe inserindo uma string começando com ou you Ymas cujo padrão é interpretar a entrada como "não".

Se você precisar verificar Y, y, Yese yes(ou seja, tratar strings como yup"não"), use

case $REPLY in ([Yy]|[Yy]es) break; esac

em vez do [[ ... ]]teste e break.

Responder2

Aqui estão duas maneiras diferentes. O primeiro usa expressões regulares para corresponder sim/não, o outro usa o selectembutido:

#!/bin/bash

echo "Version 1"

check=
while [[ -z $check ]]; do
    read -r -p "Signature Correct? (Yes/No): " check
    if [[ $check =~ ^[Nn]o?$ ]]; then
        echo "Try again"
        check=
    elif [[ $check =~ ^[Yy](es)?$ ]]; then
        echo "Signature accepted"
        break;
    else
        echo "Invalid input."
        check=
    fi
done

echo "Version 2"

PS3="Signature Correct? (1 for Yes/ 2 for No): "
select opt in Yes No; do
    case $opt in
        Yes)
            echo "Signature accepted"
            break;;
        No)
            echo "Try again.";;
        *)
            echo "Invalid input."
    esac;
done

informação relacionada