У меня есть функция оболочки 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
Какой будет правильный синтаксис для этого?
РЕДАКТИРОВАТЬ
Также - Я хочу убедиться, что даже если первое условие истинно, все остальные условия все равно будут оценены.
Спасибо,
Сначала выполните команды, а затем проверьте, успешно ли хотя бы одна из них.
#!/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
Правильный синтаксис:
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"
Используйте обратные косые черты.
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
}
Я предпочитаю:
if {
do_something "arg1" ||
do_something "arg2" ||
do_something "arg3"
}; then
echo "OK"
else
echo "NOT OK"
fi