условие if на нескольких строках в оболочке bash

У меня есть функция оболочки bash, которая принимает аргумент и выполняет что-то с ним, если это необходимо.

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

Я хочу вызвать этот метод с несколькими аргументами и проверить, удалось ли хотя бы одному из них.

Я пробовал что-то вроде:

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

Какой будет правильный синтаксис для этого?
РЕДАКТИРОВАТЬ
Также - Я хочу убедиться, что даже если первое условие истинно, все остальные условия все равно будут оценены.

Спасибо,

18
задан 11 May 2013 в 16:17

4 ответа

Сначала выполните команды, а затем проверьте, успешно ли хотя бы одна из них.

#!/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
0
ответ дан 11 May 2013 в 16:17

Правильный синтаксис:

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

\ используется, чтобы сообщить оболочке, что команда продолжается на следующей строке.

РЕДАКТИРОВАТЬ : Я думаю, что это должно делать то, что вы хотите:

#!/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"
0
ответ дан 11 May 2013 в 16:17

Используйте обратные косые черты.

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

Править

Также - я хочу удостовериться, что, даже если первое условие верно, все другие условия будут все еще оценены.

Это не возможно только в одном если оператор. Вместо этого можно использовать для цикла, который выполняет итерации по аргументам и оценивает их отдельно. Что-то как:

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
}
30
ответ дан 11 May 2013 в 16:17

Я предпочитаю:

if {
    do_something "arg1" ||
    do_something "arg2" ||
    do_something "arg3"
}; then
    echo "OK"
else
    echo "NOT OK"
fi

-1
ответ дан 17 December 2019 в 11:03

Другие вопросы по тегам:

Похожие вопросы: