echo [[:digit:]] に予期しない動作があります。

echo [[:digit:]] に予期しない動作があります。

私は尋ねたい:

echo {1,2,3}予想される動作である1 2 3に展開し、からのすべての数字を印刷すると予想されるときに返されるのecho [[:digit:]]はなぜですか?[[:digit:]]09

ベストアンサー1

なぜなら、彼らは異なっているからです。これは{1,2,3}例です支柱の拡張。これは{1,2,3}延長されました。シェルを通してecho見る前に。次のコマンドを使用すると、何が起こるかを確認できますset -x

$ set -x
$ echo {1,2,3}
+ echo 1 2 3
1 2 3

ご覧のとおり、コマンドはecho {1,2,3}次のように拡張されます。

echo 1 2 3

しかし[[:digit:]]それはPOSIX 文字クラス。渡すとechoシェルでも先に処理しますが今回は で処理されます。シェルボール。実行と同じように機能し、echo *現在のディレクトリのすべてのファイルを印刷します。しかし、[[:digit:]]どの数字とも一致できるシェルグローブです。 bashでは、シェルglobが何も一致しない場合、それ自体が拡張されます。

$ echo /this*matches*no*files
+ echo '/this*matches*no*files'
/this*matches*no*files

globが何かと一致すると、次のように印刷されます。

$ echo /e*c
+ echo /etc
/etc

どちらの場合も、echoシェルが印刷するように指示するものは何でも印刷しますが、2番目の場合はglobが何か(/etc)と一致するため、それを印刷するように指示されます。

[[:digit:]]したがって、名前が1桁の数字(一致する数字)で構成されるファイルやディレクトリがないため、globは独自に拡張され、次のようになります。

$ echo [[:digit:]]
[[:digit:]]

それでは、次のファイルを生成し5て同じコマンドを実行してみてください。

$ echo [[:digit:]]
5

一致するファイルが複数ある場合:

$ touch 1 5       
$ echo [[:digit:]]
1 5

これはman bash、この動作をオフにするオプションの説明に(やや)文書化されています。nullglob

nullglob
    If  set,  bash allows patterns which match no files (see
    Pathname Expansion above) to expand to  a  null  string,
    rather than themselves.

このオプションを設定する場合:

$ rm 1 5
$ shopt -s nullglob
$ echo [[:digit:]]  ## prints nothing

$ 

おすすめ記事