web-dev-qa-db-ja.com

シェルプロンプトから「はい」のバリエーションを受け入れるより良い方法

私が書いたシェルスクリプトのユーザビリティテストでは、答えとして「はい」が期待される質問にどのように答えるかについて、人々が異なる期待を抱いていることがわかりました。以下のコード例のバリエーションを参照してください。

きっと私が思いついたより良い方法があるに違いありませんか? 判読可能短縮形はこれをどう思いますか?

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
27
Aeyoun

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
15
sakisk

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も参照してください。

48
Random832

Bash(またはプロンプトを個別に表示する場合は他のシェル)にとどまる:

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

これは、ynをyes、 y(初期スペースあり)をno、wlkjzuhfodをnoとして受け入れます。これは最適ではないかもしれませんが、一般的なシェルプロンプトと一致しています。これがrm -ifind -okなどが行う方法です。

これは国際化の問題全体を避けています。他の言語では、予想される応答を翻訳する必要があります。そのとき、標準のShellメソッドはありません。 dialog に変更できますが、スクリプトをインストールする必要があります(多くのディストリビューションで使用できますが、デフォルトで常にインストールされるわけではありません)。

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

私は通常、単純な関数を使用します。

Confirm() { read -sn 1 -p "$* [Y/N]? "; [[ ${REPLY:0:1} = [Yy] ]]; }

この関数は、Yまたはyが入力された場合は0を返し、その他が入力された場合は1を返します。 if...fiで使用できます:

if Confirm "Type y or n"; then
echo "You typed y"
else
echo "You typed n"
fi

またはちょうどこのように:

Confirm "Type y" && echo "You typed y"
3
Chuck Metcalfe

@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.....
0
Rahul Patil