Назад | Перейти на главную страницу

листинг файла с циклом for с использованием массива и if

Я написал сценарий для проверки файлов в разных каталогах и хочу, чтобы этот сценарий показывал мне ошибку, если файл не существует. Но он показывает мне как ERROR, так и NO ERROR из-за цикла. Теперь нужно настроить так, чтобы я мог получить только ОШИБКУ или НЕТ ОШИБКИ в случае, если один или несколько файлов отсутствуют или все существуют в своих каталогах.

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

Я не могу добавить выход. Если я добавлю, то остальная часть скрипта ниже остановится. ls не имеет значения. Важно проверить наличие файлов. Это может быть что угодно, как угодно, если [-e "/ path / to / file"] и т. Д. Однако ОШИБКА важна, потому что в случае ошибки или отсутствия ошибки я отправлю себе электронное письмо, поэтому это важно .

Не могли бы вы объяснить, почему вы используете set -e?

Это не работает так, как я хочу. Информация о печати построчно. Но я хочу, чтобы он сохранял информацию для всех и ошибку принтера, если какая-либо из них отсутствует, или без ошибок, если все существует. Как это сделать ????

Строка "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"

Если вы хотите знать после завершения цикла, то очевидным будет установка переменной, указывающей, что все в порядке. Когда что-то не в порядке, вы меняете переменную, а в конце цикла смотрите в нее, чтобы узнать, не все ли в порядке:

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

Самый простой способ - удалить оператор else, добавить exit к вашему предложению then и эхо "NO ERROR" после цикла for. (Если вы прошли цикл for полностью, значит, все файлы присутствуют.)