Peço desculpas antecipadamente se for uma pergunta duplicada. Fiz um esforço para pesquisar / verificar antes de perguntar aqui.
Estou confortável em escrever one-liners como este:
foocommand && foocommand2 && foocommand3
A ideia é que eu só quero que os comandos subseqüentes sejam executados se o anterior tiver "êxito".
Estou escrevendo um script um tanto demorado e essa linha única não é viável porque parece um enorme bloco de código confuso para todos os outros.
Quero espaçar os comandos e escrever comentários entre eles no script. Como posso fazer isso e ainda ter o equivalente de && lá?
&&
não significa que o comando posterior será executado se o anterior um foi bem sucedida. Isso significa que o comando será executado se o resultado coletivo de todos os comandos anteriores na lista de comandos for bem-sucedido. Você pode saber disso, mas os futuros leitores podem entender mal.||
e&&
(em oposição a|
ou&
) é chamado de curto-circuito. O comportamento usado com os últimos operadores é chamado de avaliação ansiosa.a && b && c
será executado apenasb
sea
for bem-sucedido; portanto, "ele só será executadoc
seb
for bem-sucedido" e "somente será executadoc
sea
eb
ambos forem bem-sucedidos" são instruções equivalentes:b
não pode ser bem-a
sucedido a menos que seja bem- sucedido.a || b && c
é mais ilustrativo.true || false && echo hi
será exibidohi
. A especificação diz: Os operadores "&&" e "||" deve ter precedência igual e ser avaliado com associatividade à esquerda.Respostas:
Você pode fazer assim:
Espero ter entendido o que você pediu corretamente.
fonte
Você pode alterar a linha shebang para
Após qualquer erro, o script será interrompido.
fonte
bash
parte do curso). O shell POSIX aceita várias opções aplicáveisset
. Ou vice-versa?set
é uma maneira de definir opções de linha de comando do shell no script.-e
podem se comportar mal. Por exemplo, você provavelmente não deseja que seu script seja finalizado toda vez quediff
dois arquivos não idênticos. É claro que você pode contornar isso anexando|| true
(ou talvez|| [ $? = 1 ]
) esses comandos, mas o OP menciona um "todo mundo" que precisará ler esse script e disse que "todo mundo" provavelmente não estará acostumado a lidar com-e
.-e
no transexual, até que um administrador da minha empresa continuou lançando meus scriptsbash myscript.sh
, então ele ignorou o-e
. Agora todos os meus scripts têm umset -e
na segunda linha.Se você não gosta da
set -e
ideia, talvez possa inverter a lógica.Mais útil, substitua
exit
por algo para imprimir uma mensagem de erro útil e saia. Dentro de uma função, é claro, você deseja emreturn
vez deexit
.fonte
foocommand || exit
para sair comfoocommand
o status de saída, se diferente de zero.Você pode usar
if else fi
blocos.É um pouco mais legível.
Como alternativa, você pode usar apenas
\
para quebrar seu grande forro 1 em várias linhasMas é claro que isso pode ser confuso para os olhos não treinados.
fonte
\
é necessário lá.Você pode considerar o uso de
if
instruções aninhadas . Outra opção é usar curly's para agrupar como{ true && echo hi; } || echo huh
Atualização 1:
Aqui está um exemplo sem novas linhas / comentários:
fonte
Divida cada sequência de comandos em funções:
fonte
Eu sempre gosto de escrever uma função "falha" que me permite especificar o que eu faria quando a falha ocorreu e depois usar o
||
padrão. Como o seguinte:fonte