使用数组和 if 的 for 循环列出文件

使用数组和 if 的 for 循环列出文件

我编写了一个脚本来检查不同目录中的文件,并希望此脚本在文件不存在时显示错误。但由于循环,它同时显示错误和无错误。如何进行调整,以便在一个或多个文件丢失或所有文件都存在于其目录中时,我只能获得错误或无错误。

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 循环,则所有文件都存在。)

相关内容