2012-09-07 4 views
6

では、この単純なループを考えてみましょう。スクリプト内で$ f変数を使うと、その拡張子のファイルがない限り、すべてがうまくいきます。空集合の場合、$ fは* .textに設定され、上記の行は何もエコーするのではなく、echos:シンプルバッシュfに対する*

*.text 
*.txt 

となります。これは実際の実際のファイル名を期待しているものに$ fを使用しようとしていて、代わりに*を取得しようとしているとエラーを生成します。

ワイルドカードと一致するファイルがある場合、空のセットではないので、すべて私が望むように動作します。例えば

123.text 
456.txt 
789.txt 

どのように私はエラーなしとアスタリスクのための最初の文字列マッチング$ fの一見過度に複雑にすることなく、これを行うことができますか?

答えて

13

nullglobを設定しますイオン。

$ for f in *.foo ; do echo "$f" ; done 
*.foo 
$ shopt -s nullglob 
$ for f in *.foo ; do echo "$f" ; done 
$ 
+0

これはまさに私が探していたものです。ありがとう! – user1610022

3

ファイルが実際に存在するかどうかをテストすることができます

for f in *.{text,txt}; do if [ -f $f ]; then echo $f; fi; done 

か、findコマンドを使用することができます:あなたはlsの外部使用を余裕があるならば、あなたは脱出することができ、また

for f in $(find -name '*.text' -o -name '*.txt'); do 
    echo $f 
done 
+0

$ fが実際にファイルであるかどうかをテストするだけで十分です。しかし、それは私が避けたいと思っていた追加のテストです。 – user1610022

0

をその結果を使用して

for f in `ls *.txt *.text`; 
+0

ファイル名にスペースが含まれていると動作しません。 – choroba

+0

これは '$ IFS'を正しく設定することで修正できます。 nullglobオプションとは対照的に、これはshoptを呼び出さずにシェルスクリプト内でかなり安全に行うことができます。 – ThePadawan

+0

どうぞご覧ください。また、 'shopt'は組み込み関数なので、" out "とは呼ばない。 – choroba

関連する問題