如果目录中没有文件,请不要启动循环?

时间:2013-10-22 10:00:46

标签: bash shell unix solaris

所有

我在Solaris 10中运行BASH

我有以下shell脚本在目录中循环,具体取决于CSV文件的存在。

这段代码的问题在于,即使该目录中没有CSV文件,然后调用SQL loader,它仍会进行一次循环。

SQLLoader然后生成一个日志文件,因为没有要处理的文件,这开始搞乱我的目录,用日志文件填充它。

for file in *.csv ; 
do 
    echo "SQLLoader is reading : " $file
    sqlldr <User>/<Password>@<DBURL>:<PORT>/<SID> control=sqlloader.ctl log=$inbox/$file.log data=$inbox/$file
done

如果$ inbox

目录中没有CSV文件,如何阻止它进入循环

3 个答案:

答案 0 :(得分:3)

说:

shopt -s nullglob
for循环之前

这是默认值,如果您没有任何匹配的文件,则说for file in *.csv会将其扩展为*.csv

引用documentation

  

nullglob

     

如果设置,Bash允许不匹配任何文件的文件名模式扩展为null   字符串,而不是自己。

答案 1 :(得分:1)

使用find搜索文件

for file in `find -name "*.csv"` ;

答案 2 :(得分:1)

首先,使用nullglob是正确答案(如果可用)。但是,可以使用符合POSIX的选项。

如果没有匹配项,模式将被视为文字文本。你可以用一个小黑客来抓住这个:

for file in *.csv; do
    [ -f "$file" ] || break
    ...
done

如果没有匹配项,file将设置为文字字符串*.csv,这不是文件名,因此-f "$file"将失败。否则,file将依次设置为与模式匹配的每个文件的名称,-f "$file"每次都会成功。请注意,即使存在名为*.csv的文件,这也会起作用。缺点是您必须为每个现有文件进行冗余测试。