Como posso fazer algo assim no bash?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
bash
control-flow
Michael Mrozek
fonte
fonte
then
em uma linha separada.if ! command ; then ... ; fi
.[
é em si um comando e não é necessário neste caso.if [ ! command ]
não executacommand
; ele tratacommand
como uma string e o trata como verdadeiro porque tem um comprimento diferente de zero.[
é um sinônimo para otest
comandoPara pequenas coisas que você deseja que ocorram se um comando shell funcionar, você pode usar a
&&
construção:Da mesma forma, para pequenas coisas que você deseja que ocorram quando um comando do shell falha, você pode usar
||
:Ou ambos
Provavelmente, não é aconselhável fazer muito com essas construções, mas elas podem ocasionalmente tornar o fluxo de controle muito mais claro.
fonte
Verifique o valor de
$?
, que contém o resultado da execução do comando / função mais recente:fonte
if
idioma de Bash . Eu prefiro a resposta de Keith Thompson.if
é fazer isso. Todas as condições de controle de fluxo no Bash são examinadas$?
nos bastidores; é isso que eles fazem. O exame explícito de seu valor deve ser desnecessário na grande maioria dos casos, e geralmente é um antipadrão para iniciantes.if ! cmd
bem. Caso contrário, um acordo comum é usar umaelse
cláusula. Você não pode ter um vazio,then
mas às vezes vêthen : nothing; else
onde o:
no-op é significativo.true
iria trabalhar lá também.Isso funcionou para mim:
se
command
for bem-sucedido,echo "OK"
é executado e, como é bem-sucedido, a execução pára por aí. Caso contrário,&&
é ignorado eecho "NOK"
é executado.fonte
command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
command && echo "OK" || (c=$?; echo "NOK"; (exit $c))
?echo "OK"
parte em si poderia falhar, então isso é melhor:command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
Deve-se notar que
if...then...fi
e&&
/||
tipo de abordagem lida com o status de saída retornado pelo comando que queremos testar (0 em caso de sucesso); no entanto, alguns comandos não retornam um status de saída diferente de zero se o comando falhar ou não puder lidar com a entrada. Isso significa que as abordagens usuaisif
e&&
/||
não funcionarão para esses comandos específicos.Por exemplo, no Linux, o GNU
file
ainda sai com 0 se recebeu um arquivo não existente como argumento efind
não conseguiu localizar o usuário especificado.Nesses casos, uma maneira potencial de lidarmos com a situação é lendo
stderr
/stdin
mensagens, por exemplo, aquelas que retornaram porfile
comando ou analisam a saída do comando como emfind
. Para esse propósito, acase
instrução pode ser usada.fonte
O mais propenso a erros que eu poderia ter foi:
RR=$?
Agora, não apenas para esta situação, mas para outras que você possa enfrentar, considere:
variável definida:
$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi
Resposta: sim
$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi
Resposta: não
Variável indefinida:
$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi
Resposta: não
$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi
Resposta: sim
$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi
Resposta: sim
Isso evita todos os tipos de erros.
Você provavelmente conhece toda a sintaxe, mas aqui estão algumas dicas:
"blank"
sernothing
.${variable}
.base-8
. Você receberá um erro como:value too great for base (error token is "08")
para números acima7
. É quando10#
entra em jogo:10#
força o número a serbase-10
.fonte
Você consegue fazer isso:
fonte
ping
é capturada em vista de executá-lo como um comando. Mas como a saída é redirecionada para / dev / null, essa sempre será a string vazia. Portanto, você não está executando nada em um subshell, o que significa que o status de saída anterior (do subshell de substituição de comando, que é ping) será mantido. Obviamente, a maneira correta estáif ping ...; then
aqui.Como observado em outra parte deste segmento, a pergunta original basicamente se responde. Aqui está uma ilustração mostrando que as
if
condições também podem ser aninhadas.Este exemplo usa
if
para verificar se um arquivo existe e se é um arquivo regular. Se essas condições forem verdadeiras, verifique se ele tem ou não um tamanho maior que 0.fonte
fonte
Isso pode ser feito simplesmente desta maneira, pois
$?
fornece o status do último comando executado.Então poderia ser
fonte