2

Ubuntuボックスで実行されているbashスクリプトに次のステートメントがあります。

for l in foo_????
do
     # do something with $l
done

パターンに一致するファイルがない場合、これは正しく機能しません。

for ループの先頭に次を追加しました。

if [ -f foo_??? ]
then
   for l in foo_???

パターンに一致するファイルが 0 個または 1 個の場合は機能しますが、それ以上のファイルがある場合は失敗します。line 4: [: foo_123: binary operator expected

パターンに一致するファイルが 1 つ以上ある場合にのみループするように、このブロックを変更するにはどうすればよいですか?

4

2 に答える 2

4

パターンに一致するファイルがなく、ループを失敗させたくない場合は、nullglobディレクティブを設定します。

~/foo $ echo *
*
~/foo $ shopt -s nullglob
~/foo $ echo *

~/foo $ 

ステートメントが失敗した理由ifは、ループが失敗した理由と同じforです。展開されていないグロブがまだそこにありました。sh準拠したバージョンのスクリプトが必要な場合は、ディレクティブの代わりにステートメントを使用できますが、調整する必要がありますifnullglob

for file in foo_???; do
    if [ -f "$file" ]; then
        …
    fi
done
于 2013-04-11T18:58:20.577 に答える