Qual é o equivalente a && ao escrever um script bash?

31

Peço desculpas antecipadamente se esta for uma pergunta duplicada. Eu fiz um esforço para procurar / verificar antes de perguntar aqui.

Estou confortável em escrever frases assim:

foocommand && foocommand2 && foocommand3

A idéia é que eu quero apenas comandos subseqüentes para executar se o anterior foi "bem sucedido".

Eu estou escrevendo um script um pouco longo e este one-liner não é viável porque parece um enorme bloco de código confuso para todos os outros.

Eu quero espaçar os comandos e escrever comentários entre eles no script. Como posso fazer isso e ainda ter o equivalente a & & lá?

    
por Mike B 02.02.2013 / 21:15

7 respostas

23

Você pode fazer assim:

#!/bin/sh
ls -lh &&
    # This is a comment
    echo 'Wicked, it works!'

Espero ter entendido o que você perguntou corretamente.

    
por 02.02.2013 / 21:20
38

Você pode alterar a linha shebang para

#!/bin/bash -e

Após qualquer erro, o script será interrompido.

    
por 02.02.2013 / 21:21
19

Se você não gostar da ideia de set -e , talvez possa inverter a lógica.

foocommand || exit 1
foocommand2 || exit 2
foocommand3 || exit 3

Mais proveitosamente, substitua exit por algo para imprimir uma mensagem de erro útil e saia. Dentro de uma função, é claro, você quer return em vez de exit .

    
por 02.02.2013 / 21:40
9

Você pode usar if else fi blocks.

if foocommand; then

  # some comments

  if foocommand2; then

    # more comments

    foocommand3
  fi
fi

É um pouco mais legível.

Alternativamente, você pode usar apenas \ para dividir seu grande liner em várias linhas

foocommand && \
  # some comment
  foocommand2 && \
    # more comment
    foocommand3

Mas é claro que isso pode ser confuso para o olho destreinado.

    
por 02.02.2013 / 21:26
5

Você pode considerar o uso de declarações if aninhadas. Outra opção é usar os cacheados para agrupar como { true && echo hi; } || echo huh

Atualização 1:

Veja um exemplo sem novas linhas / comentários:

{ { false && echo "inner true"; } && { echo "inner true" && true; } || { echo "inner false" && false; } || echo "outter false"; }
    
por 02.02.2013 / 21:29
4

Divida cada sequência de comandos em funções:

big_block_1() {
  # ...
}
big_block_2() {
  # ...
}
big_block_3() {
  # ...
}

big_block_1 && big_block_2 && big_block_3
    
por 05.02.2013 / 03:47
0

Sempre gosto de escrever uma função "fail" que me permita especificar o que eu faria quando a falha ocorresse e depois usar o padrão || . Como o seguinte:

function fail() {
  echo "Failure: ${@}"
  exit 1
}

foocommand || fail "couldn't foo"
    
por 08.02.2013 / 21:33