У меня есть функция оболочки 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
Какой будет правильный синтаксис для этого?
РЕДАКТИРОВАТЬ
Также - я хочу убедиться, что даже если первое условие истинно, все остальные условия все равно будут оценены.
Благодарность,
Ответы:
Сначала запустите команды, а затем проверьте, успешно ли хотя бы одна из них.
источник
if ((success))
оценивая что-то иное, чемif success
. Я в замешательстве :)((...))
- это арифметическая команда. Если результат внутри не равен нулю, он возвращает true (0). Если результат внутри равен 0, он возвращает false (1). «успех» рассматривается как переменная, которая, как ожидается, будет содержать число. См. Mywiki.wooledge.org/ArithmeticExpressionИспользуйте обратную косую черту.
РЕДАКТИРОВАТЬ
Кроме того - я хочу убедиться, что даже если первое условие истинно, все остальные условия все равно будут оценены.
Это невозможно только в одном условии if. Вместо этого вы можете использовать цикл for, который перебирает аргументы и оценивает их отдельно. Что-то вроде:
источник
[: do_something: unary operator expected
[ expr1 ] || [ expr2 ]
вместо[ expr1 || expr2 ]
.do_something "arg1"
это интерпретируется как два аргумента, тогда как выражение должно быть одинарным. Любой способ заставитьdo_something "arg1"
быть оценен как один аргумент?if [ $(do_something "arg1") ]
.Правильный синтаксис:
\
используется, чтобы сообщить оболочке, что команда продолжается на следующей строке.РЕДАКТИРОВАТЬ : Я думаю, что это должно делать то, что вы хотите:
источник
[: too many arguments
Я предпочитаю:
источник
\n
Ваш сценарий не будет работать вообще: после 1-го тестового параметра он сгенерирует символ, поэтому вашif
оператор вызовет некоторые ошибки, аdo_something
не имена команд, поэтому больше ошибокdo_something
это функция, конечно.do_something
должна быть функция или команда, что еще должно быть? Кроме того, я не вижу, где он будет генерировать\n
персонажа, кроме как после повторения результата, и это ожидается ...