如果在目录中没有文件,不要启动循环?(Do not start loop if there is n

2019-10-18 19:14发布

所有,

我已在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文件

Answer 1:

说:

shopt -s nullglob

在你for循环。

这是不是默认,并说for file in *.csv时,你没有任何匹配的文件它扩展到*.csv

从引用文档 :

nullglob

如果设置,bash允许没有匹配的文件扩展为空字符串,而不是自己这名样式。



Answer 2:

使用find搜索文件

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


Answer 3:

首先,采用nullglob是正确的答案,如果它是可用的。 但是,符合POSIX标准的选项。

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

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

如果没有匹配, file将被设置为文本字符串*.csv ,这不是一个文件的名称,所以-f "$file"将失败。 否则, file将依次对每个文件的模式匹配的名称进行设置, -f "$file"将每次都能成功。 请注意,这会工作,即使有一个名为文件*.csv 。 其缺点是,你必须为每个现有的文件冗余测试。



文章来源: Do not start loop if there is no files in directory?