所有
我在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文件,如何阻止它进入循环答案 0 :(得分:3)
说:
shopt -s nullglob
在for
循环之前。
这是不默认值,如果您没有任何匹配的文件,则说for file in *.csv
会将其扩展为*.csv
。
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
的文件,这也会起作用。缺点是您必须为每个现有文件进行冗余测试。