我编写了一个脚本来检查不同目录中的文件,并希望此脚本在文件不存在时显示错误。但由于循环,它同时显示错误和无错误。如何进行调整,以便在一个或多个文件丢失或所有文件都存在于其目录中时,我只能获得错误或无错误。
files=("/my/path/to/file1.tar.gz" "/my/path/to/file2.tar.gz")
for i in "${files[@]}"
do
ls -l $i
if [ $? -ne 0 ]; then
echo "ERROR"
else
echo "NO ERROR"
fi
done
我无法添加 exit,如果我添加,下面的其余脚本将停止。ls 并不重要。重要的是检查文件是否存在。它可以是任何方式,例如 if [ -e "/path/to/file"] 等。但是 ERROR 很重要,因为无论出现错误还是没有错误,我都会向自己发送电子邮件,这就是它的重要性。
你能解释一下为什么使用“set -e”吗?
它没有按我想要的方式工作。它逐行打印信息。但我希望它存储所有信息,如果缺少任何一条信息,则打印错误;如果所有信息都存在,则不显示错误。这怎么可能做到???
答案1
字符串“ERROR”重要吗?否则:
set -e
for i in "/my/path/to/file1.tar.gz" "/my/path/to/file2.tar.gz" ; do
[ -e "$i" ]
done
编辑:
来自 bash 手册:
-e Exit immediately if a simple command (see SHELL GRAMMAR
above) exits with a non-zero status. The shell does not
exit if the command that fails is part of the command list
immediately following a while or until keyword, part of the
test in an if statement, part of a && or || list, or if the
command's return value is being inverted via !. A trap on
ERR, if set, is executed before the shell exits.
如果您要打印,我们需要更详细一些:
for i in "/my/path/to/file1.tar.gz" "/my/path/to/file2.tar.gz" ; do
[ -e "$i" ] || { echo "ERROR" ; exit 1 ; }
done
echo "NOERROR"
答案2
如果你想知道循环结束后会发生什么,那么显然可以设置一个变量来表明一切正常。当出现问题时,你可以更改变量,然后在循环结束时查看变量以查看是否有问题:
ok=1
for i in "${files[@]}"
do
if [ ! -e "$i" ]; then
ok=0
fi
done
if [ $ok -eq 1 ]; then
echo "NO ERROR"
else
echo "ERROR"
fi
使用[ ! -e "$i" ]
将避免打印出错误,尽管ls
你可以这样做
ls -l "$i" > /dev/null 2>&1
ls
将的输出和错误重定向到 /dev/null
答案3
最简单的方法是删除 else 语句,exit
在 then 子句中添加一个,然后在 for 循环后回显“NO ERROR”。(如果您已经完成了所有 for 循环,则所有文件都存在。)