web-dev-qa-db-ja.com

bash-変数の大文字と小文字を区別しないマッチング

次の構文は、変数が「no」の場合に「linux」を出力します。

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

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

4
yael

標準sh

そのkshスタイルの_[[...]]_コマンドを使用する必要はありません。ここで標準のshcase構文を使用できます。

_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

大文字と小文字を区別しないマッチングを行う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
_

allで大文字小文字を区別せずに一致させるより危険性が低い)

_[[ ${(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 onesであっても、世界中のすべての人々が大文字のバージョンが何であるかについて同意するわけではありません。

ASCII ones、少なくともGNUシステムでは、英語の規則からの逸脱は、iIの文字、およびドットは、大文字または小文字のバージョンに存在するか、存在しません。

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

11

これを実行する前に、既存のコマンドをそのままにしておきます。

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

変数に保存されている値の大文字小文字に関係なく、これにより置換値が小文字になります。その結果、既存のコマンドが1行だけのコードと一致します。

2