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

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

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

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

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

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

Какой будет правильный синтаксис для этого? EDIT Также - я хочу убедиться, что даже если первое условие верно, все остальные условия будут по-прежнему оценены.

Спасибо,

1
задан 11 May 2013 в 17:17

2 ответа

Использовать обратную косую черту

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

EDIT

Также - я хочу убедиться, что даже если первое условие истинно, все остальные условия будут по-прежнему оценены. [!d3 ]

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

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
}
19
ответ дан 24 May 2018 в 22:20
  • 1
    спасибо, попробовал - я получаю сообщение об ошибке [: do_something: unary operator expected – Itay 11 May 2013 в 16:56
  • 2
    Вы помещали каждую оценку между ее собственными скобками? Поэтому [ expr1 ] || [ expr2 ] вместо [ expr1 || expr2 ]. – tectux 11 May 2013 в 16:59
  • 3
    да :(... – Itay 11 May 2013 в 17:01
  • 4
    Я предполагаю, что do_something "arg1" интерпретируется как два аргумента, тогда как выражение должно быть унарным. Любой способ сделать do_something "arg1" оцениваться как один аргумент? – Itay 11 May 2013 в 17:10
  • 5
    Ты прав. Это тоже работает: if [ $(do_something "arg1") ]. – tectux 11 May 2013 в 17:13

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

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

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

EDIT: Я думаю, что это должно делать то, что вы хотите:

#!/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
ответ дан 24 May 2018 в 22:20
  • 1
    Спасибо, результаты с ошибкой: [: too many arguments – Itay 11 May 2013 в 16:59
  • 2
    @Itay Ответ обновлен. – Eric Carvalho 11 May 2013 в 17:13
  • 3
    Обновление вопроса - это еще не окончательный ответ :( – Itay 11 May 2013 в 17:16

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

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