私が書いたシェルスクリプトのユーザビリティテストでは、答えとして「はい」が期待される質問にどのように答えるかについて、人々が異なる期待を抱いていることがわかりました。以下のコード例のバリエーションを参照してください。
きっと私が思いついたより良い方法があるに違いありませんか? 判読可能と短縮形はこれをどう思いますか?
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
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
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も参照してください。
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 -i
、find -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"
@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.....