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スクリプトは、ユーザーから有効な応答を受け取る必要があると主張します(ユーザーがこれらの2文字(大文字または小文字)のいずれかで始まる単語を提供しない場合は、再度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コードを入力すると、エラーメッセージと「確認してください」メッセージの両方を印刷したいようです。したがって、ユーザーがで始まる単語を入力すると、これら2つのメッセージが出力されますn

「PLEASE CHECK」メッセージが常に出力されるようにするには、その行printfをスクリプトの最後に移動します。

答え2

互換性のある方法で実行できます。

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

または最近のbashを使用している場合:

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

関連情報