標準sh
その 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
.
他のシェルを使用したその他のバリアント:
zsh
set -o nocasematch
[[ $LINUX_CONF = no ]] && echo linux
(bash
と同じ) ).
setopt extendedglob
[[ $LINUX_CONF = (#i)no ]] && echo linux
(すべて作るよりも危険が少ない 大文字と小文字を区別しないで一致)
[[ ${(L)LINUX_CONF} = no ]] && echo linux
(小文字の演算子に変換)
set -o rematchpcre
[[ $LINUX_CONF =~ '^(?i)no\z' ]]
(PCRE 構文)
ksh93
[[ $LINUX_CONF = ~(i)no ]]
または
[[ $LINUX_CONF = ~(i:no) ]]
[nN][oO]
以外の上記のすべてのアプローチに注意してください 大文字と小文字を区別しない一致は、ユーザーのロケールによって異なります。世界中のすべての人が、特定の文字の大文字バージョンが何であるかについて同意しているわけではありません。たとえ ASCII 文字であってもです。
少なくとも GNU システムでは、ASCII の実際には、英語の規則からの逸脱は i
に制限されているようです。 と I
文字と、大文字または小文字バージョンにドットがあるかどうか。
つまり、[[ ${VAR,,} = oui ]]
OUI
で一致するとは限りません すべてのロケールで (bash
の現在のバージョンのバグであっても) は修正されています)。
これを実行する前に、既存のコマンドを保持します。
LINUX_CONF=$(echo $LINUX_CONF | awk '{ print tolower($0) }')
変数に格納されている値の大文字と小文字に関係なく、これにより置換値が強制的に小文字になります。これにより、既存のコマンドと一致するコードが 1 行だけ追加されます。