Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 若目录中并没有文件,是否不启动循环?_Bash_Shell_Unix_Solaris - Fatal编程技术网

Bash 若目录中并没有文件,是否不启动循环?

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>/&

全部,

我正在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
用于*.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”)