シェルプロンプトで「はい」バリアントを可能にするより良い方法

シェルプロンプトで「はい」バリアントを可能にするより良い方法

私が書いたシェルスクリプトの使いやすさテストでは、人々が「はい」という答えを期待する質問に答える方法についてさまざまな期待を持っていることがわかりました。以下のコード例のバリエーションをご覧ください。

確かに私が思いついたよりも良い方法がありますか?あなたの…読めるそしてより短い形式これを受け入れますか?

read -p 'Answer this question with yes: ' answer
if [ "$answer" = 'Y'
  -o "$answer" = 'YES'
  -o "$answer" = 'Yes'
  -o "$answer" = 'y'
  -o "$answer" = 'yes'
  -o some-alternate-condition ]; then

  echo 'Surely this can be written better?'
fi

答え1

UNIX 標準では、次のコードを使用してサンプルコードを提供します。locale便利:

if printf "%s\n" "$response" | grep -Eq "$(locale yesexpr)"
then
    affirmative processing goes here
else
    non-affirmative processing goes here
fi

POSIXロケール(および実際のシステムの英語ロケール)では、「yesexpr」の値はです"^[yY]"。拡張正規表現として解釈されます。 noexprも参照してください。

答え2

aの使用はcaseやや同じですが、同様のステートメントが許可YEされているため、完璧ではありません。

read -p 'Answer this question with yes: ' answer
case "${answer}" in
    [yY]|[yY][eE][sS])
        echo 'Surely this can be written better?' ;;
esac

答え3

bash(またはプロンプトを独立して表示する場合は別のシェル)を維持してください。

case $answer in
  [Yy]*) echo Ok;;
  *) echo "Can't you read? I said to say yes.";;
esac

yn「はい」、 y(初期スペースを含む)「いいえ」、「いいえ」などの応答を許可します。wlkjzuhfodこれは最適ではないかもしれませんが、一般的なシェルプロンプトと一致します。これが他のrm -iすべての人find -okが行うことです。

これは国際化の全体的な問題を迂回します。他の言語では、予想される応答を翻訳する必要があります。これにより、使用できる標準シェル方法はありません。会話ただし、スクリプトをインストールする必要があります(多くのディストリビューションで使用できますが、デフォルトでは常にインストールされるわけではありません)。

if dialog --yesno "Choose yes" 0 0; then …

答え4

@faif ansを修正しました。

YesOrNo() {
        while :
        do
                read -p 'Do you want to Continue (yes/no?): ' answer
                case "${answer}" in
                    [yY]|[yY][eE][sS]) exit 0 ;;
                        [nN]|[nN][oO]) exit 1 ;;
                esac
        done
}


if $( YesOrNo ); then
        echo "Ans is yes.. Do something....."
else
        echo "Ans is No... skip.."
fi

テスト

root@ubuntu:~# bash confirm.sh
Do you want to Continue (yes/no?):  # if Blank Enter then ask again
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?): no
Ans is No... skip..
root@ubuntu:~# bash confirm.sh
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?): ye
Do you want to Continue (yes/no?): yes
Ans is yes.. Do something.....

関連情報