Я не знаю, что делает wait %%
, но это должно помочь:
#!/bin/bash
mysqldump --all-databases | gzip -9 > /backup/temp_db.gz
tar -Pcf /backup/temp_ftp.tar /public_html/
tar -Pcf /backup/temp_backup.tar /home/temp_db.gz /backup/temp_ftp.tar && \
/backup/upload.sh || \
/backup/upload.sh
ПРИМЕЧАНИЕ : никогда не забывайте, что вы можете настроить scp
(и ssh
тоже) для работы без паролей ! Я бы посчитал это вместо expect
(это отличный инструмент).
Таким образом, upload.sh
будет выполняться только после того, как последняя команда tar завершила либо успешно, либо с кодами выхода из ошибки.
Дополнительная информация:
- Если вы напишите
test && command
, command
будет выполняться только в случае успешного прохождения теста.
- Если вы напишите
test || command
, command
будет выполняться только в случае неудачного теста.
Запустите эти тесты:
$ true && echo "Yes."
Yes.
$ false || echo "Yes."
Yes.
Обратите внимание, что результаты полностью соответствуют интуиции о таких логических сравнениях, и все хорошо, пока вы не думаете о том факте, что true равно 0. :)
Вот еще одна схема, обычно встречающаяся в программировании сценариев оболочки и интерактивных сессиях:
$ command1 && command2 && command3 && command4
Эта строка кода не будет запускать следующую команду в последовательности, если предыдущая команда не вернула "true", что означает отсутствие ошибок. Это способ избежать запуска команды, если требуемый предыдущий результат отсутствует.
Также см. эту статью о &&
и ||
тестировании.
НТН