web-dev-qa-db-fra.com

si condition sur plusieurs lignes dans le shell bash

J'ai une fonction bash Shell qui prend un argument et effectue quelque chose dessus si nécessaire.

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

Je veux appeler cette méthode avec plusieurs arguments et vérifier si au moins l'un d'entre eux a réussi.

J'ai essayé quelque chose comme:

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

Quelle sera la syntaxe correcte pour cela?
EDIT
Aussi - je veux être sûr que même si la première condition est vraie, toutes les autres conditions seront toujours évaluées.

Merci,

17
Itay

Lancez d'abord les commandes, puis vérifiez si au moins l'une d'entre elles a réussi.

#!/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
6
geirha

Utilisez des barres obliques inverses.

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

EDIT

De plus, je veux m'assurer que, même si la première condition est vraie, toutes les autres conditions seront toujours évaluées.

Ce n'est pas possible dans une seule déclaration if. À la place, vous pouvez utiliser une boucle for qui itère sur les arguments et les évalue séparément. Quelque chose comme:

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
}
28
tectux

La syntaxe correcte est la suivante:

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

\ est utilisé pour indiquer au shell qu'une commande continue à la ligne suivante.

EDIT: Je pense que cela devrait faire ce que vous voulez:

#!/bin/bash

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

do_something "arg1"
do_something "arg2"
do_something "arg3"
5
Eric Carvalho