se condição em várias linhas no shell bash

12

Eu tenho uma função de shell bash que aceita um argumento e executa algo nele, se necessário.

do_somthing() {
  if [need to do something on ]
  then
    do it
    return 0
  else
    return 1
  fi
}

Eu quero chamar esse método com vários argumentos e verificar se pelo menos um deles foi bem-sucedido.

Eu tentei algo como:

if [ do_something "arg1" ||
     do_something "arg2" ||
     do_something "arg3" ]
then
  echo "OK"
else
  echo "NOT OK"
fi

Qual será a sintaxe correta para isso?
EDITAR
Além disso, quero ter certeza de que, mesmo que a primeira condição seja verdadeira, todas as outras condições ainda serão avaliadas.

Obrigado,

    
por Itay 11.05.2013 / 13:33

3 respostas

5

Execute os comandos primeiro e, em seguida, verifique se pelo menos um deles foi bem-sucedido.

#!/bin/bash

success=0
do_something arg1 && success=1
do_something arg2 && success=1
do_something arg3 && success=1

if ((success)); then
    printf 'Success! At least one of the three commands succeeded\n'
fi
    
por geirha 12.05.2013 / 16:54
19

Use barras invertidas.

if [ $(do_something "arg1") ] || \
   [ $(do_something "arg2") ] || \
   [ $(do_something "arg3") ]
then
  echo "OK"
else
  echo "NOT OK"
fi

EDITAR

Além disso, quero ter certeza de que, mesmo que a primeira condição seja verdadeira, todas as outras condições ainda serão avaliadas.

Isso não é possível em apenas uma declaração if. Em vez disso, você pode usar um loop for que itera sobre os argumentos e os avalia separadamente. Algo como:

do_something() {
  for x in "$@"
  do
    if [need to do something on $x]
    then
      do it
    else
      echo "no action required on $x"
    fi
  done
}
    
por tectux 11.05.2013 / 13:54
5

A sintaxe correta é:

if  do_something "arg1" || \
    do_something "arg2" || \
    do_something "arg3"
then
  echo "OK"
else
  echo "NOT OK"
fi

\ é usado para informar ao shell que um comando continua na próxima linha.

EDIT : acho que isso deve fazer o que você quer:

#!/bin/bash

do_something() {
  if [need to do something on ]
  then
    do it
    echo "OK"
  else
    echo "NOT OK"
  fi
}

do_something "arg1"
do_something "arg2"
do_something "arg3"
    
por Eric Carvalho 11.05.2013 / 13:56

Tags