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 y
ou Y
mas cujo padrão é interpretar a entrada como "não".
Se você precisar verificar Y
, y
, Yes
e 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 select
embutido:
#!/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