GNU/Linux >> Linux の 問題 >  >> Linux

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

標準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 行だけ追加されます。


Linux
  1. Bash動的(変数)変数名?

  2. Bashで合法的なコマンドの前に変数を設定するのはなぜですか?

  3. Bash変数代入の単一括弧?

  1. パターンに一致する最新のファイルを見つけるための Bash 関数

  2. Bash のリストに変数が存在するかどうかを確認する

  3. grep を bash の変数に渡す

  1. Bashスクリプト(I)

  2. SedでBash文字列変数への参照を使用しますか?

  3. Bash スクリプトのパターン マッチング