Не выполняется действие в переменной bash
Пишу скрипт для автоматического обновления ssl сертификатов. Проблема в том, что когда доходит до рестарта docker-compose, то действие падает с ошибкой
No such file or directory
а затем curl не выполняется, и говорит команда не найдена. Логика такая: скачать архив, распаковать, удалить архив, перенести старые сертификаты, затем положить новые, перезапустить nginx, отправить результат в слак.
#!/bin/bash
wildcard_mask='my.domain'
restart_srv_dir='/root/docker-containers/'
restart_comm='docker-compose -f /root/docker-containers/docker-compose.yml restart nginx'
ssl_dir='/root/docker-containers/nginx/ssl/'
ssl_backup_dir='/root/docker-containers/nginx/ssl/backup/'
nginx_dir='/root/docker-containers/nginx/ssl/'
update_success='curl -X POST -H 'Content-type: application/json' -H 'Authorization: Bearer xoxb-XXXX-XXXX-XXXX' --data '{"username":"'$wildcard_mask'", "text":"Update SSL Success!"}' https://hooks.slack.com/services/XXXX/XXXX/XXXX'
update_failed='curl -X POST -H 'Content-type: application/json' -H 'Authorization: Bearer xoxb-XXXX-XXXX-XXXX' --data '{"username":"'$wildcard_mask'", "text":"Update SSL Failed!"}' https://hooks.slack.com/services/XXXX/XXXX/XXXX'
cd /opt/
wget "https://my.server/ssl/$wildcard_mask.zip"
if test -s "$wildcard_mask.zip"; then
unzip "$wildcard_mask.zip"
rm "$wildcard_mask.zip"
mv "$ssl_dir"*.pem "$ssl_backup_dir"
mv *.pem "$nginx_dir"
cd "$restart_srv_dir"
"$restart_comm"
"$update_success"
else
echo "$wildcard_mask failed to download!"
"$update_faided"
fi
echo 'Update SSL Complete'
Ответы (2 шт):
Мне представляется, что у тут проблема в упаковке аргументов в одну строку. Команду и каждый из аргументов следует сохранять в отдельной строке, а все вместе - в списке.
typeset -r cmd=("command" "long arg1" "long arg2")
"${cmd[@]}"
Сразу несколько замечаний:
Не понятен смысл переносить в переменные команды, которые вызываются единожды, т.е. если это конечный вариант скрипта, то проще всего вставить команды как есть.
Отвечая на вопрос почему возникают ошибки, то это из за кавычек, интерпретатор воспринимает всю строку как команду, не разбивая на приложение и аргументы, уберите двойные кавычки на вызове переменных с аргументами
$update_success, все должно получитсяПроверяйте написанное, у вас переменная
update_failed='curl -X POST -H ....'
А далее вы пытаетесь вызвать $update_faided которая не объявлена.
- Рассмотрите возможность использования функций, для примера:
update() {
text="${1}"
curl -X POST -H 'Content-type: application/json' -H 'Authorization: Bearer xoxb-XXXX-XXXX-XXXX' --data '{"username":'"$wildcard_mask"', "text":'"$text"'}' https://hooks.slack.com/services/XXXX/XXXX/XXXX
#_______________________________________________________________________________________________________________________________________________^^^^^^^___________________________________________________
}
И далее вызывать с параметром подходящим под ситуацию:
...
update 'Update SSL Success!'
else
echo "$wildcard_mask failed to download!"
update 'Update SSL Failed!'
...