所有,
我已在Solaris 10上运行BASH
我有根据的CSV文件的存在是在循环的目录下面的shell脚本。
问题是与这段代码是,它仍然没有即使在该目录中没有的CSV文件一个循环,然后调用SQL装载机。
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
如何阻止它进入一个循环,如果在收件箱$的那个目录没有CSV文件
说:
shopt -s nullglob
在你for
循环。
这是不是默认,并说for file in *.csv
时,你没有任何匹配的文件它扩展到*.csv
。
从引用文档 :
nullglob
如果设置,bash允许没有匹配的文件扩展为空字符串,而不是自己这名样式。
使用find
搜索文件
for file in `find -name "*.csv"` ;
首先,采用nullglob
是正确的答案,如果它是可用的。 但是,符合POSIX标准的选项。
如果没有匹配的模式将被视为文字文本。 你可以用小黑客抓住这个:
for file in *.csv; do
[ -f "$file" ] || break
...
done
如果没有匹配, file
将被设置为文本字符串*.csv
,这不是一个文件的名称,所以-f "$file"
将失败。 否则, file
将依次对每个文件的模式匹配的名称进行设置, -f "$file"
将每次都能成功。 请注意,这会工作,即使有一个名为文件*.csv
。 其缺点是,你必须为每个现有的文件冗余测试。