Я новичок в написании скриптов bash, и часть моего скрипта, приведенная ниже, не выводит никаких данных.
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
Я не получаю никаких сообщений об ошибках. Есть ли помощь с этим? Если у вас есть более умное или короткое решение, я был бы благодарен за возможность воспользоваться знаниями.
Спасибо!
решение1
Предположение:
#!/bin/bash
while true; do
read -p 'Is signature correct? y/[n]: '
[[ $REPLY == [Yy]* ]] && break
echo 'Ok, asking again...'
done
echo 'Signature accepted'
Это реализует бесконечный цикл, из которого пользователь выходит, вводя строку, начинающуюся с «или» y
, Y
но которая по умолчанию интерпретирует ввод как «нет».
Если вам нужно проверить на Y
, y
, Yes
и yes
(т.е. обработать строки как yup
«нет»), то используйте
case $REPLY in ([Yy]|[Yy]es) break; esac
вместо [[ ... ]]
теста и break
.
решение2
Вот два разных способа. Первый использует регулярные выражения для сопоставления «да/нет», другой использует select
встроенную функцию:
#!/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