Как объединить команды bash с || и && операторы? - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь сделать что-то похожее на"try .. catch" с bash, для которого я прочитал из этого поста , что хороший вариант как-то копировать try / улов это использовать || и && операторы. В моем случае у меня есть фрагмент кода, который должен заархивировать некоторые файлы, но на самом деле zip пуст, поэтому он выдает ошибку:

zip -v OUTPUT.zip file1 file2 >> $LOGFILE 2>&1

Затем в LOGFILE я вижу:

zip error: Nothing to do! (OUTPUT.zip)
zip warning: OUTPUT.zip not found or empty
...(continued error message)

Так что я делаю это вместо этого, чтобы «поймать ошибку»

{ zip -v OUTPUT.zip file1 file2 >> $LOGFILE 2>&1 } || { printf "Error while zipping!" >> $LOGFILE && exit 1 }

.., что частично работает. Он выходит из кода, но не выполняет команду printf (или, по крайней мере, я не вижу ее в LOGFILE).

Кроме того, , хотя он встречает команда «exit 1» (в строке 115), у меня также есть сообщение (строка 120 - моя последняя строка):

line 120: syntax error: unexpected end of file

Что не так в моей команде? Почему он не выполняет печать, и почему сообщение «неожиданный конец файла»? Извините, если этот вопрос больше относится к общему программированию bash, чем к использованию || &&, но я не знал, как иначе классифицировать это.

Большое спасибо!

1 Ответ

1 голос
/ 31 марта 2020

В фигурных скобках вы должны завершить все команды точкой с запятой, как показано в следующей записи (вы можете видеть, что в последней строке bash ожидает ввода дополнительной команды):

pax> { false; } || echo x;
x
pax> { false } || echo x;
+++> _

Вам также не нужно «готовиться» к простой команде, поэтому правильная вещь в вашем случае будет такой:

zip -v OUTPUT.zip file1 file2 >> $LOGFILE 2>&1 || { echo "Error while zipping!" >> $LOGFILE ; exit 1 }

Я также использовал echo вместо printf, при условии, что вам понадобится символ новой строки в конце файла, и exit сделает безусловным в случае успеха или иным образом printf / echo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...