2012-05-22 16 views
5

は、次のことを考える:nocasematchがオフのときに大文字と小文字が区別されないのはなぜですか?

$ echo $BASH_VERSION 
4.2.10(1)-release 

$ shopt | fgrep case 
nocaseglob  off 
nocasematch  off 

$ case A in [a-z]) echo TRUE;; esac 
TRUE 

私は大文字の小文字の文字クラス[-z]はと一致していないはずですが、それがないことを期待しています。なぜこれは合わないのですか?

+0

'nocaseglob'は無関係である:'パス名展開を行う際の挙動がまだあるがセットは、bashは、 '(上記パス名展開を参照)大文字と小文字を区別しない方法でファイル名と一致する場合奇妙な – Daenyth

答えて

7

このようにダッシュを確実に使用することはできません。私はダッシュを使用しない場合は、予想通り、それは動作します:ダッシュ

$ bash --version 
GNU bash, version 4.2.10(1)-release (x86_64-pc-linux-gnu) 
Copyright (C) 2011 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 

This is free software; you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 
$ shopt -s nocasematch 
$ case A in [abc]) echo TRUE;; esac 
TRUE 
$ shopt -u nocasematch 
$ case A in [abc]) echo TRUE;; esac 
$ 

しかし、それは関係なく、nocasematchの設定TRUE出力します。

ここでパターンマッチングしています。 this section of the reference manualを確認してください。ハイフンを使用して[a-z][A-Za-z]と解釈することがあります。伝統的な解釈(LC_COLLATEまたはLC_ALLをCに設定)を得る方法を説明します。基本的に、デフォルトのロケールは辞書順にソートされています。リファレンスマニュアルは物事をうまく説明しています。オーケー

補遺

私はあなたのためのトランスクリプトを持っています。

$ shopt -u nocasematch 
$ case A in [a-z]) echo TRUE;; esac 
TRUE 
$ shopt -s nocasematch 
$ case A in [a-z]) echo TRUE;; esac 
TRUE 
$ LC_ALL=C 
$ shopt -u nocasematch 
$ case A in [a-z]) echo TRUE;; esac 
$ shopt -s nocasematch 
$ case A in [a-z]) echo TRUE;; esac 
TRUE 
7

ロケール設定と関係があります。具体的には、照合シーケンスは大文字小文字を区別しないシーケンスです。例えば

en_AU.utf8からLC_COLLATEセット(私のシステム上のデフォルト)で、あなたはそれが小文字含まれていることを見ることができると一緒に大文字:

pax> case A in [a-b]) echo TRUE;; esac 
TRUE 
pax> _ 

をしかし、あなたは、範囲指定を取り除く場合、それは期待通りに動作します:

pax> case A in [ab]) echo TRUE;; esac 
pax> _ 

その照合順序のために、Aを含み、第一の手段between a and b inclusiveためだこと。後者の意味は、abのみです。照合シーケンスの影響を受ける範囲ではありません。あなたは、大文字と小文字を区別したものとご照合順序を設定した場合

は、それはあなたが期待するように動作します

pax> export LC_COLLATE="C" 
pax> case A in [a-b]) echo TRUE;; esac 
pax> 

あなただけの何かに影響を与えることなく、一回の操作としてこれを実行したい場合は、することができますサブシェルでそれを行う:

(export LC_COLLATE="C" ; case A in [a-b]) echo TRUE;; esac) 
関連する問題