Poniżej funkcja z 9 argumentami:
SUM() {
echo "The sum is $(($1+$2+$3+$4+$5+$6+$7+$8+$9))"
}
Chcę, aby drugi argument do następnego (3..9) stał się argumentem opcjonalnym .
Gdy wywołuję funkcję z 2 argumentami, pojawia się błąd:
SUM 3 8
bash: 3+8+++++++: syntax error: operand expected (error token is "+")
Uwaga BOLD : pierwszy argument i drugi argument są argumentami wymuszającymi i nie są opcjonalne dla funkcji. Chcę tylko, aby drugi argument do następnego był opcjonalny, a gdy wywołam funkcję mniej niż 2 argumenty, funkcja nie może zwrócić żadnego wyniku.
Spójrz na
shift
operatora. Przenosi argumenty 2 i dalej do pozycji 1 i dalej, odrzucając argument 1.źródło
Możesz użyć definicji rekurencyjnej, która kończy się, gdy
sum
zostanie wywołana bez argumentów. Korzystamy z faktu, żetest
bez argumentów oceniafalse
.źródło
Spróbuj tego:
To da 12 i 30.
$@
odnosi się do parametru,$#
zwraca liczbę parametru, w tym przypadku 3 lub 11.Testowane na linhat redhat 4
źródło
Możesz po prostu użyć małej pętli:
Osobiście jednak użyłbym
perl
lubawk
zamiast tego:lub
źródło
Użyj 0 jako wartości domyślnych od 1 do 9 USD:
Od
man bash
:Przykłady:
Suma wynosi 0
Suma wynosi 3
Suma wynosi 9
Ta sama wydajność z awk:
źródło
To także moje własne rozwiązanie. Wypróbowałem to i znalazłem:
Ale odpowiedź @ muru jest dobra.
źródło