1

全部,

我在 Solaris 10 中运行 BASH

我有以下 shell 脚本,它根据 CSV 文件的存在在目录中循环。

这段代码的问题在于,即使该目录中没有 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

如果 $inbox 的那个目录中没有 CSV 文件,我如何阻止它进入循环

4

3 回答 3

3

说:

shopt -s nullglob

在你的for循环之前。

不是默认设置,for file in *.csv当您没有任何匹配的文件时将其扩展为*.csv.

引用文档

nullglob

如果设置,Bash 允许不匹配文件的文件名模式扩展为空字符串,而不是它们本身。

于 2013-10-22T10:03:45.483 回答
1

用于find搜索文件

for file in `find -name "*.csv"` ;
于 2013-10-22T10:06:24.450 回答
1

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

如果没有匹配,该模式将被视为文字文本。你可以用一个小技巧来抓住它:

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

当没有匹配项时,file将设置*.csv为不是文件名的文字字符串,因此-f "$file"会失败。否则,file将依次设置为每个匹配模式的文件的名称,并且-f "$file"每次都会成功。请注意,即使有一个名为*.csv. 缺点是您必须对每个现有文件进行冗余测试。

于 2013-10-22T12:32:04.107 回答