Bash 若目录中并没有文件,是否不启动循环?
全部, 我正在Solaris 10中运行BASH 我有下面的shell脚本,它根据CSV文件的存在在目录中循环 这段代码的问题在于,即使该目录中没有CSV文件,它仍会执行一个循环,然后调用SQL loader SQLLoader然后生成一个日志文件,因为没有要处理的文件,这开始把我的目录弄得一团糟,用日志文件填充它Bash 若目录中并没有文件,是否不启动循环?,bash,shell,unix,solaris,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>/&
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中的文件;
做
echo“SQLLoader正在读取:“$file”
sqlldr/@:/control=sqlloader.ctl log=$inbox/$file.log data=$inbox/$file
完成
如果$inbox目录中没有CSV文件,如何阻止它进入循环呢
shopt -s nullglob
在您的for
循环之前
这是而不是默认值,如果没有任何匹配的文件,则对*.csv中的文件说,
,会将其扩展为*.csv
引述:
nullglob
如果设置了,Bash允许不匹配任何文件的文件名模式扩展为null
而不是他们自己
说:
在您的for
循环之前
这是而不是默认值,如果没有任何匹配的文件,则对*.csv中的文件说,
,会将其扩展为*.csv
引述:
nullglob
如果设置了,Bash允许不匹配任何文件的文件名模式扩展为null
而不是他们自己
使用
find
搜索文件
for file in `find -name "*.csv"` ;
使用
find
搜索文件
for file in `find -name "*.csv"` ;
首先,如果可用,使用
nullglob
是正确的答案。但是,有一个兼容POSIX的选项可用
如果没有匹配项,则该模式将被视为文本。你可以用一个小技巧来解决这个问题:
for file in *.csv; do
[ -f "$file" ] || break
...
done
如果没有匹配项,
文件
将设置为文本字符串*.csv
,该字符串不是文件名,因此-f“$file”
将失败。否则,file
将依次设置为与模式匹配的每个文件的名称,-f“$file”
每次都将成功。注意:即使存在名为*.csv的文件,这也会起作用。缺点是您必须对每个现有文件进行冗余测试。首先,如果可用,使用nullglob
是正确的答案。但是,有一个兼容POSIX的选项可用
如果没有匹配项,则该模式将被视为文本。你可以用一个小技巧来解决这个问题:
for file in *.csv; do
[ -f "$file" ] || break
...
done
如果没有匹配项,文件
将设置为文本字符串*.csv
,该字符串不是文件名,因此-f“$file”
将失败。否则,file
将依次设置为与模式匹配的每个文件的名称,-f“$file”
每次都将成功。注意:即使存在名为*.csv的文件,这也会起作用。缺点是您必须对每个现有文件进行冗余测试。您可以将其替换为find
表达式,如for file in$(find.-maxdepth 1-name“*.csv”)
您可以将其替换为find
表达式,如for file in$(find.-maxdepth 1-name“*.csv”)