se condizione su più righe nella shell bash

13

Ho una funzione di shell bash che accetta un argomento ed esegue qualcosa su di esso, se necessario.

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

Voglio chiamare questo metodo con diversi argomenti e controllare se almeno uno di essi è riuscito.

Ho provato qualcosa del tipo:

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

Quale sarà la sintassi corretta per questo?
EDIT Inoltre, voglio assicurarmi che anche se la prima condizione è vera, tutte le altre condizioni saranno comunque valutate.

Grazie,

    
posta Itay 11.05.2013 - 13:33
fonte

3 risposte

5

Esegui prima i comandi, poi controlla se almeno uno di essi ha avuto successo.

#!/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
    
risposta data geirha 12.05.2013 - 16:54
fonte
20

Utilizza i backslash.

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

Modifica

Inoltre - Voglio assicurarmi che anche se la prima condizione è vera tutte le altre condizioni saranno ancora valutate.

Questo non è possibile in una sola istruzione if. Invece è possibile utilizzare un ciclo for che itera sugli argomenti e li valuta separatamente. Qualcosa come:

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
}
    
risposta data tectux 11.05.2013 - 13:54
fonte
5

La sintassi corretta è:

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

\ è usato per dire alla shell che un comando continua nella riga successiva.

EDIT : penso che questo dovrebbe fare ciò che vuoi:

#!/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"
    
risposta data Eric Carvalho 11.05.2013 - 13:56
fonte

Leggi altre domande sui tag