IF-ELSE - Y|N 응답이 예상대로 작동하지 않습니다.

IF-ELSE - Y|N 응답이 예상대로 작동하지 않습니다.

방금 for 루프를 사용하여 다음을 달성하는 것이 어렵다는 것을 알았습니다. 귀하의 조언이나 도움을 주시면 감사하겠습니다. 감사해요

  1. 사용자가 대문자나 소문자로 응답하면 수락하고 대문자로 변환해야 합니다.
  2. "N" 응답에 대해 또 다른 if 루프를 제공하려고 하면 해당 루프를 건드리지 않지만 첫 번째 루프(ELSE 조건) 자체에서 오류가 발생합니다.

echo -n "IS THIS A PRODUCTION DATABASE. PLEASE RESPOND Y|N :- "
read RESPONSE
RSPN=$RESPONSE
if [ "${RSPN}" = "Y" ]
then
print "\n"
echo -n "PLEASE ENSURE A 7 YEARS RETENTION RMAN_FULL BACKUP TAKEN for $DBTD"
print "\n"
else
echo "ERROR: Cannot proceed as 7 Years backup not yet TAKEN for PRODUCTION database. Please take a 7 Years Retention backup and re-run the script again."
exit 1
print "\n"
fi
###############################################################
if [ "${RSPN}" = "N" ]
then
print "\n"
echo -n "PLEASE CHECK IF BACKUP IS REQUIRED BEFORE DECOMMISSIONING $DBTD
print "\n"
fi
###############################################################

출력 --->

IS THIS A PRODUCTION DATABASE. PLEASE RESPOND Y|N :- N
ERROR: Cannot proceed as 7 Years backup not yet TAKEN for PRODUCTION database. Please take a 7 Years Retention backup and re-run the script again.

답변1

다음 /bin/sh스크립트는 사용자로부터 유효한 응답을 받아야 한다고 주장합니다(사용자가 이 두 문자(대문자 또는 소문자) 중 하나로 시작하는 단어를 제공하지 않으면 y다시 묻습니다).n

while true; do
    printf 'IS THIS A PRODUCTION DATABASE? [y/n]: '
    read response

    case "$response" in
        [Yy]*) 
            printf 'PLEASE ENSURE A 7 YEARS RETENTION RMAN_FULL BACKUP TAKEN for %s\n' "$DBTD"
            break
            ;;
        [Nn]*)
            printf 'ERROR: Cannot proceed as 7 Years backup not yet TAKEN for PRODUCTION database. Please take a 7 Years Retention backup and re-run the script again.\n'
            printf 'PLEASE CHECK IF BACKUP IS REQUIRED BEFORE DECOMMISSIONING %s\n' "$DBTD"
            break
            ;;
        *) printf 'Invalid response "%s"\n' "$response"
    esac
done

사용자가 N코드를 입력하면 오류 메시지와 "확인하세요" 메시지를 모두 인쇄하려는 것 같습니다. 그래서 사용자가 로 시작하는 단어를 입력하면 이 두 메시지를 출력합니다 n.

"PLEASE CHECK" 메시지가 항상 출력되도록 하려면 printf해당 줄을 스크립트 끝으로 이동하면 됩니다.

답변2

호환되는 방식으로 수행할 수 있습니다.

if [ "${RSPN}" = "Y" ] || [ "${RSPN}" = "y" ]

또는 최근 bash를 사용하는 경우:

if [ "${RSPN^}" = "Y" ]

관련 정보