3

bashのファイルパターンで次のIMHOの奇妙な動作に遭遇しました。

$ ls
Basic1  datei1  datie2  sdfl
$ ls [a-z]*
Basic1  datei1  datie2  sdfl
$ ls [abcdefghijklmnopqrstuvwxyz]*
datei1  datie2  sdfl

範囲のパターンで[a-z]大文字と小文字が区別されないのはなぜですか?バグまたは機能?

  1. bash-Optionnocaseglobは次のとおりですoff(そうでない場合、上記の2番目のパターンも大文字と小文字を区別しないはずです...):

    $ shopt nocaseglob
    nocaseglob  off
    
  2. 私のbashバージョン:

    $ bash --version
    GNU bash, Version 4.2.24(1)-release (i686-pc-linux-gnu)
    

GNU bash、バージョン4.2.24(1)-リリース(i686-pc-linux-gnu)

4

1 に答える 1

6

小文字で始まるファイル名のみが必要な場合は、

ls [[:lower:]]*

編集

F. Hauriのコメントに答える:リファレンスマニュアルのセクション3.5.8.1はそれをすべて述べています。しかし、それを読む前に、少し遊んでみましょう(YMMV):新しいスクラッチディレクトリを作成し、

$ # Create lots of cool files
$ touch {a..z} {A..Z}
$ ls
a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z
A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z
$ ls [a-b]
a A b
$ # Do you get it?
$ ls [a-B]
a A b B

したがって、bashのアルファベット順(ここで、私のマシンでは、私の設定を使用)は次のようになります。

aAbBcCdDeE...

これはあなたがあなたの結果を得た理由を説明するかもしれません(あなたの設定は私のものと似ているようです)。

ここで、リファレンスマニュアルのセクション3.5.8.1を読んでください。物事はそれほど単純ではなく、順序は環境変数の値に依存することがわかりますLC_COLLATE

だから試してみてください:

$ LC_COLLATE=C
$ ls [a-b]
a b

うん!

道徳の

小文字が必要な場合は[a-z]、ローカル設定に大きく依存するため、使用しないでください。代わりに、を使用して[[:lower:]]ください。リファレンスマニュアルには、他にもいくつかの便利な文字クラスがあります。

結論

それで、バグまたは機能?あなたは今答えを持っています;-)

お役に立てれば!

于 2012-12-18T10:59:53.637 に答える