Eu tenho um script bash simples que deve criar um arquivo de despejo de um banco de dados
docker exec -i container sh -c "mongodump --archive" > \
~/dumps/db-$(date + "%d%m%Y").dump 2> \
~/logs/dumps/db-$(date + "%d%m%Y").log \
Pediram-me para garantir que o script lidaria com quaisquer erros, então tentei adicionar o seguinte ao script.
docker exec -i container sh -c "mongodump --archive" > \
~/dumps/db-$(date + "%d%m%Y").dump 2> \
~/logs/dumps/db-$(date + "%d%m%Y").log \
exit_status=$?
if [ exit_status -ne 0 ]; then
echo "An error occured while running mongodump. Exit Status: $exit_status"
fi
O acima foi minha tentativa. Se o status de saída for qualquer coisa menos 0, envie uma mensagem de eco com o código de saída real. O script cria com sucesso um arquivo de despejo, no entanto, recebo o seguinte erro:
[: exit_status: integer expression expected
Minha suposição é que, por causa do meu redirecionamento de log, o comando em si não relata um status de saída na conclusão. Mas não tenho tanta certeza. Ainda estou aprendendo as manhas do script Bash, então qualquer conselho é bem-vindo.
O problema é que você está terminando seu comando em um
\
que sugere que o comando continuará na próxima linha. No primeiro trecho de código, isso funcionou, pois não havia nada depois disso, exceto o fim do arquivo. No entanto, agora que você adicionou mais coisas, seu erro de sintaxe original está voltando para mordê-lo, e o comando que você está realmente executando se tornou (removendo o detalhe para mostrar a estrutura):É por isso que este script simples reproduz seu erro:
Corrida que resulta em:
Porque
exit_status=$?
foi executado como parte do comando anterior, isso significa que ele foi simplesmente passado como mais um argumento para seudocker
comando. Você executoudocker ... exit_status=$?
. Isso significa que ele nunca foi executado como uma atribuição de variável e, portanto, a variávelexit_status
não está definida em seu ambiente. Como não está definida, você obtém esse erro. É o mesmo que você obteria com qualquer nome de variável aleatório e inexistente. Por exemplo:Basta remover o final
\
do seu script e ele funcionará:Ou, já que você realmente não precisa de uma variável, você pode simplificar (e corrigir a ortografia) para:
Ou mesmo apenas: