9

大文字と小文字を区別しない while ステートメントで比較を記述しようとしています。基本的に、私は単に以下を短縮して、ユーザーへの「はい」または「いいえ」の質問プロンプトに対応しようとしています...

while[ $yn == "y" | $yn == "Y" | $yn == "Yes" | $yn == "yes" ] ; do

これについて最善の方法は何ですか?

4

5 に答える 5

11
shopt -s nocasematch
while [[ $yn == y || $yn == "yes" ]] ; do

また :

shopt -s nocasematch
while [[ $yn =~ (y|yes) ]] ; do

ノート

  • [[[コマンドに似た (しかしより強力な) bash キーワードです。http://mywiki.wooledge.org/BashFAQ/031およびhttp://mywiki.wooledge.org/BashGuide/TestsAndConditionalsを参照してください
    。POSIX sh 用に作成している場合を除き、[[.
  • =~演算子は[[、左側の文字列を右側の拡張正規表現 (ERE) に対して評価します。一致が成功した後、BASH_REMATCHパターンから一致したグループを展開するために使用できます。正規表現の引用部分はリテラルになります。安全で互換性を保つために、正規表現をパラメーターに入れて実行します[[ $string =~ $regex ]]
于 2013-03-21T21:09:27.510 に答える
8

shopt や正規表現を使用する必要はありません。これを行う最も簡単で迅速な方法 (Bash 4 を使用している場合):

if [ "${var1,,}" = "${var2,,}" ]; then
  echo "matched"
fi

そこで行っているのは、両方の文字列を小文字に変換し、結果を比較することだけです。

于 2015-08-25T17:45:17.893 に答える
3

正規表現の代わりに拡張パターンを使用する回答は次のとおりです。

shopt -s nocasematch
shopt -s extglob
while [[ $yn = y?(es) ]]; do
  ...
done

バージョン 4.1 以降、 ではbash常に[[ ... ]]条件式内で拡張パターンが使用されるため、このshopt行は必要ありません。

于 2013-03-21T21:33:15.767 に答える
1

これも試してください:

 [[ $yn =~ "^[yY](es)?$" ]] 
于 2013-03-21T21:12:45.480 に答える