Я написал сценарий для проверки файлов в разных каталогах и хочу, чтобы этот сценарий показывал мне ошибку, если файл не существует. Но он показывает мне как 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 полностью, значит, все файлы присутствуют.)