나는 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
이는 사용자가 or로 시작하는 문자열을 입력하여 중단하는 무한 루프를 구현 Y
하지만 입력은 기본적으로 "no"로 해석됩니다.
Y
, y
및 Yes
및 yes
(즉, 문자열을 yup
"no"로 처리) 확인해야 하는 경우 다음을 사용하십시오.
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