次の構文は、変数が「no」の場合に「linux」を出力します。
[[ $LINUX_CONF = no ]] && echo "linux"
比較で大文字と小文字を区別しないようにするには、正規表現(または類似の)をどのように使用しますか?
そのksh
スタイルの_[[...]]
_コマンドを使用する必要はありません。ここで標準の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
と同じ)。
_setopt extendedglob
[[ $LINUX_CONF = (#i)no ]] && echo linux
_
(allで大文字小文字を区別せずに一致させるより危険性が低い)
_[[ ${(L)LINUX_CONF} = no ]] && echo linux
_
(小文字の演算子に変換)
_set -o rematchpcre
[[ $LINUX_CONF =~ '^(?i)no\z' ]]
_
(PCRE構文)
_[[ $LINUX_CONF = ~(i)no ]]
_
または
_[[ $LINUX_CONF = ~(i:no) ]]
_
大文字と小文字を区別しないマッチングを行う_[nN][oO]
_以外の上記のすべてのアプローチは、ユーザーのロケールに依存することに注意してください。 ASCII onesであっても、世界中のすべての人々が大文字のバージョンが何であるかについて同意するわけではありません。
ASCII ones、少なくともGNUシステムでは、英語の規則からの逸脱は、i
とI
の文字、およびドットは、大文字または小文字のバージョンに存在するか、存在しません。
つまり、すべてのロケールで_[[ ${VAR,,} = oui ]]
_がOUI
に一致することが保証されているわけではありません( 現在のバージョンのbash
のバグが修正されている場合でも)。
これを実行する前に、既存のコマンドをそのままにしておきます。
LINUX_CONF=$(echo $LINUX_CONF | awk '{ print tolower($0) }')
変数に保存されている値の大文字小文字に関係なく、これにより置換値が小文字になります。その結果、既存のコマンドが1行だけのコードと一致します。