大文字と小文字を区別しない while ステートメントで比較を記述しようとしています。基本的に、私は単に以下を短縮して、ユーザーへの「はい」または「いいえ」の質問プロンプトに対応しようとしています...
while[ $yn == "y" | $yn == "Y" | $yn == "Yes" | $yn == "yes" ] ; do
これについて最善の方法は何ですか?
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を参照してください[[
.=~
演算子は[[
、左側の文字列を右側の拡張正規表現 (ERE) に対して評価します。一致が成功した後、BASH_REMATCH
パターンから一致したグループを展開するために使用できます。正規表現の引用部分はリテラルになります。安全で互換性を保つために、正規表現をパラメーターに入れて実行します[[ $string =~ $regex ]]
shopt や正規表現を使用する必要はありません。これを行う最も簡単で迅速な方法 (Bash 4 を使用している場合):
if [ "${var1,,}" = "${var2,,}" ]; then
echo "matched"
fi
そこで行っているのは、両方の文字列を小文字に変換し、結果を比較することだけです。
正規表現の代わりに拡張パターンを使用する回答は次のとおりです。
shopt -s nocasematch
shopt -s extglob
while [[ $yn = y?(es) ]]; do
...
done
バージョン 4.1 以降、 ではbash
常に[[ ... ]]
条件式内で拡張パターンが使用されるため、このshopt
行は必要ありません。
これも試してください:
[[ $yn =~ "^[yY](es)?$" ]]