私は尋ねたい:
echo {1,2,3}
予想される動作である1 2 3に展開し、からのすべての数字を印刷すると予想されるときに返されるのecho [[:digit:]]
はなぜですか?[[:digit:]]
0
9
ベストアンサー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
$