Mam funkcję powłoki bash, która pobiera argument i w razie potrzeby wykonuje coś na nim.
do_somthing() {
if [need to do something on $1]
then
do it
return 0
else
return 1
fi
}
Chcę wywołać tę metodę z kilkoma argumentami i sprawdzić, czy przynajmniej jeden z nich się powiódł.
Próbowałem czegoś takiego:
if [ do_something "arg1" ||
do_something "arg2" ||
do_something "arg3" ]
then
echo "OK"
else
echo "NOT OK"
fi
Jaka będzie do tego poprawna składnia?
EDYCJA
Również - Chcę się upewnić, że nawet jeśli pierwszy warunek jest prawdziwy, wszystkie pozostałe warunki będą nadal oceniane.
Dzięki,
Odpowiedzi:
Najpierw uruchom polecenia, a następnie sprawdź, czy przynajmniej jedno z nich się udało.
źródło
if ((success))
ocenia na coś innego niżif success
. Jestem zmieszany :)((...))
to polecenie arytmetyczne. Jeśli wynik w środku jest niezerowy, zwraca true (0). Jeśli wynik w środku wynosi 0, zwraca false (1). „sukces” jest traktowany jako zmienna, która, jak się oczekuje, zawiera liczbę. Zobacz mywiki.wooledge.org/ArithmeticExpressionUżyj ukośników odwrotnych.
EDYTOWAĆ
Ponadto - chcę się upewnić, że nawet jeśli pierwszy warunek jest spełniony, wszystkie pozostałe warunki będą nadal oceniane.
Nie jest to możliwe tylko w przypadku instrukcji if. Zamiast tego możesz użyć pętli for, która iteruje argumenty i ocenia je osobno. Coś jak:
źródło
[: do_something: unary operator expected
[ expr1 ] || [ expr2 ]
zamiast[ expr1 || expr2 ]
.do_something "arg1"
to interpretowane jako dwa argumenty, podczas gdy wyrażenie powinno być jednoargumentowe. Jakikolwiek sposób dokonywaniado_something "arg1"
oceny może być oceniany jako jeden argument?if [ $(do_something "arg1") ]
.Prawidłowa składnia to:
\
służy do poinformowania powłoki, że polecenie jest kontynuowane w następnym wierszu.EDYCJA : Myślę, że powinno to zrobić, co chcesz:
źródło
[: too many arguments
Wolę:
źródło
\n
znak, więc twojaif
instrukcja wygenerowałaby błędy, ado_something
nie nazwy poleceń, więc więcej błędówdo_something
jest oczywiście funkcją.do_something
musi być funkcją lub poleceniem, co jeszcze powinno być? Co więcej, nie widzę miejsca, w którym wygenerowałoby\n
postać, chyba że po