bash - 大文字と小文字を区別しない変数の一致

bash - 大文字と小文字を区別しない変数の一致

この構文は、変数が「no」のときに「linux」を出力します。

 [[ $LINUX_CONF = no ]] && echo "linux"

比較で大文字と小文字を区別しないようにするには、正規表現(または同様のもの)をどのように使用しますか?

答え1

標準形

ksh-styleコマンドを使用する必要はありません。[[...]]ここでは標準sh case構成を使用できます。

case $LINUX_CONF in
  ([Nn][Oo]) echo linux;;
  (*)        echo not linux;;
esac

または、可能な各ケースの名前を個別に指定します。

case $LINUX_CONF in
  (No | nO | NO | no) echo linux;;
  (*)                 echo not linux;;
esac

強く打つ

bash大文字と小文字を区別しない一致を実行する特定の方法では、次のことができます。

shopt -s nocasematch
[[ $LINUX_CONF = no ]] && echo linux

または:

[[ ${LINUX_CONF,,} = no ]] && echo linux

${VAR,,}文字列を小文字に変換する構文はどこにありますか?)

次を割り当てるときに変数を強制的に小文字にすることもできます。

typeset -l LINUX_CONF

これはkshでも提供されており、サポートされてbashいますzsh

他のシェルに対する追加のバリエーション:

扱いにくい

set -o nocasematch
[[ $LINUX_CONF = no ]] && echo linux

(と同じbash)。

set -o extendedglob
[[ $LINUX_CONF = (#i)no ]] && echo linux

(作るより危険性が低いみんな一致は大文字と小文字を区別しません)

[[ ${(L)LINUX_CONF} = no ]] && echo linux
[[ $LINUX_CONF:l = no ]] && echo linux

(小文字演算子に変換)

set -o rematchpcre
[[ $LINUX_CONF =~ '^(?i)no\z' ]]

(PCRE構文)

クッシュ 93

[[ $LINUX_CONF = ~(i)no ]]

または

[[ $LINUX_CONF = ~(i:no) ]]

大文字と小文字を区別しない一致を除いて、[nN][oO]上記の方法はすべてユーザーのロケールによって異なります。世界中の誰もが特定の文字の大文字のバージョンが何であるかに同意するわけではありません。 ASCII文字の場合でも同様です。

実際、ASCIIでは、少なくともGNUシステムでは、英語の規則との偏差は、アンパサンドとドットが大文字または小文字のバージョンで存在するかどうかiに制限されるようです。I

つまり、[[ ${VAR,,} = oui ]]すべてのロケールで一致が保証されるわけではありませんOUI現在のバージョンのバグbash固定されています。)

答え2

既存のコマンドを保持しますが、実行する前にオンラインで作成してください。

LINUX_CONF=$(echo $LINUX_CONF | awk '{ print tolower($0) }')

これにより、変数に格納されている値の大文字と小文字に関係なく、代替値が小文字になります。これにより、既存のコマンドが1行の追加コードと一致するようになります。

関連情報