Eu preciso escrever um pequeno script de shell que executará um script python e obterá os resultados.
Quando tento executar desta forma funciona:
#!/bin/sh
/usr/bin/python /etc/scripts/backup.py
result=$?
if [ $result -gt 0 ];
then echo 'PROBLEM';
else
echo 'OK';
fi
Mas se eu tentar fazer dessa forma, ele falha:
#!/bin/sh
if [ $(/usr/bin/python /etc/scripts/backup.py) -gt 0 ];
then echo 'PROBLEM';
else
echo 'OK';
fi
Ele retorna:
lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: 0: unknown operand
OK
E os resultados estão errados. Deve estar imprimindo "PROBLEMA"" em vez de OK.
o que eu tentei até agora
if [ $(/usr/bin/python /etc/scripts/backup.py) -ne 0 ];
retorna
lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: 0: unknown operand
OK
E eu também tentei isso:
if [ "$(/usr/bin/python /etc/scripts/backup.py)" -gt 0 ];
ele retorna:
lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: out of range
OK
Alguém pode me apontar na direção certa?
Obrigado.
Um comando não retorna seu status de saída (
$?
) na saída padrão. Uma substituição de comando ($(...)
) captura a saída padrão.Em vez disso, apenas faça
Isso escolheria a primeira ramificação e imprimiria
PROBLEM
se o script python saísse com um status de saída diferente de zero.Você pode ler a
if
declaração como "Se o script não foi bem-sucedido".Se você quiser se livrar do
!
:Você pode ler a
if
declaração como "Se o script foi bem-sucedido".O erro que você obtém vem do fato de que o script não produz nada, o que significa que a substituição do comando estará vazia. Como não está entre aspas, o comando que o shell tentará executar será semelhante
Este é um erro de sintaxe.
Ao citar a substituição do comando, você essencialmente tenta executar
e o shell não consegue comparar a string vazia como um inteiro.
Como mostra Kusalananda, você só precisa usar
Em um exemplo mais ilustrativo, você pode executar comandos como este para ver como os códigos de saída diferentes de zero são "falsos" e um código de saída 0 é verdadeiro para 'if', 'while' e outras comparações lógicas em estruturas de comando shell.
O loop while funciona como mostrado abaixo:
Isso pode ser usado para repetir um comando que não consegue se conectar ou precisa de uma nova tentativa até que seja bem-sucedido.
O uso de (exit ...) executa esse comando como um processo separado. Para comandos de shell integrados, isso é necessário para impedir que a instância de shell que executa seu script seja encerrada. Em vez disso, um subprocesso é criado pelo shell e seu código de saída fornece o valor de $? conforme mostrado na página de manual do shell.