Próbuję wyszukać, jak przekazać parametry w funkcji Bash, ale zawsze pojawia się sposób przekazania parametru z wiersza polecenia.
Chciałbym przekazać parametry w moim skrypcie. Próbowałem:
myBackupFunction("..", "...", "xx")
function myBackupFunction($directory, $options, $rootPassword) {
...
}
Ale składnia jest nieprawidłowa, jak przekazać parametr do mojej funkcji?
bash
parameters
arguments
stivlo
źródło
źródło
Odpowiedzi:
Istnieją dwa typowe sposoby deklarowania funkcji. Wolę drugie podejście.
lub
Aby wywołać funkcję z argumentami:
Funkcja odnosi się do przekazanych argumentów według ich pozycji (a nie nazwy), czyli 1 $, 2 $ i tak dalej. $ 0 to nazwa samego skryptu.
Przykład:
Ponadto musisz wywołać swoją funkcję po jej zadeklarowaniu.
Wynik:
Odsyłacz: Przewodnik zaawansowanego skryptu bash .
źródło
function name() {}
. Może z „enter” przed{}
function
słowa kluczowego i()
. Moim celem (w pliku, a nie w wierszu poleceń) jest zwiększenie przejrzystości, a nie zmniejszenie liczby wpisywanych znaków, a mianowiciefunction myBackupFunction() compound-statement
.function
wersja słowa kluczowego jest rozszerzeniem; druga forma działa we wszystkich powłokach zgodnych z POSIX.function
słowo kluczowe miało gwarancje w starych powłokach rodziny ksh, które wprowadziły go, że współczesne bash nie honoruje (w takich powłokachfunction
domyślnie zmienne były lokalne; w bash , to nie). Jako takie, jego użycie zmniejsza jasność dla każdego, kto zna i może się spodziewać zachowania ksh. Zobacz wiki.bash-hackers.org/scripting/obsoleteZnajomość języków programowania wysokiego poziomu (C / C ++ / Java / PHP / Python / Perl ...) zasugeruje laikowi, że funkcje bash powinny działać tak, jak w innych językach. Zamiast tego funkcje bash działają jak polecenia powłoki i oczekują, że zostaną im przekazane argumenty w taki sam sposób, w jaki można przekazać opcję do polecenia powłoki (np
ls -l
.). W efekcie argumenty funkcji w bash są traktowane jako parametry pozycyjne ($1, $2..$9, ${10}, ${11}
i tak dalej). Nie jest to zaskoczeniem, biorąc pod uwagę sposóbgetopts
działania. Nie używaj nawiasów do wywoływania funkcji w bash.( Uwaga : w tej chwili pracuję nad Open Solaris.)
Chcesz używać nazw dla zmiennych. Po prostu to zrób.
Chcesz przekazać tablicę do funkcji?
Wewnątrz funkcji obsłuż takie argumenty.
Chcesz przekazać wartość i tablicę, ale nadal używać „$ @” wewnątrz funkcji?
źródło
Jeśli wolisz parametry nazwane, możliwe jest (z kilkoma sztuczkami) przekazanie nazwanych parametrów do funkcji (umożliwia także przekazywanie tablic i referencji).
Opracowana przeze mnie metoda pozwala zdefiniować nazwane parametry przekazywane do funkcji takiej jak ta:
Możesz także dodawać adnotacje do argumentów jako @required lub @readonly, tworzyć ... pozostałe argumenty, tworzyć tablice z argumentów sekwencyjnych (używając np.
string[4]
) I opcjonalnie wyświetlać argumenty w wielu wierszach:Innymi słowy, nie tylko możesz wywoływać swoje parametry według ich nazw (co stanowi bardziej czytelny rdzeń), możesz faktycznie przekazywać tablice (i odniesienia do zmiennych - ta funkcja działa jednak tylko w bash 4.3)! Ponadto wszystkie zmapowane zmienne są w zasięgu lokalnym, podobnie jak 1 USD (i inne).
Kod, który sprawia, że ta praca jest dość lekka i działa zarówno w bash 3, jak i bash 4 (to jedyne wersje, z którymi go testowałem). Jeśli interesuje Cię więcej takich sztuczek, które sprawiają, że programowanie w bash jest znacznie przyjemniejsze i łatwiejsze, możesz rzucić okiem na mój Bash Infinity Framework , poniższy kod jest dostępny jako jedna z jego funkcjonalności.
źródło
@var
,@reference
,@params
zmienne? Co powinienem sprawdzić w Internecie, aby dowiedzieć się więcej na ten temat?ucommon
moim kodem a nim. Możliwe, że masz zainstalowane jakieś narzędzie, które powoduje wspomniany problem, nie mam pojęcia, co to może być.Pomiń pareny i przecinki:
a funkcja powinna wyglądać następująco:
źródło
Mam nadzieję, że ten przykład może ci pomóc. Pobiera od użytkownika dwie liczby, podaje je do wywołanej funkcji
add
(w ostatnim wierszu kodu),add
podsumowuje je i drukuje.źródło
Prosty przykład, który wyczyści zarówno podczas wykonywania skryptu, jak i wewnątrz skryptu podczas wywoływania funkcji.
źródło
Pomyślałem, że wprowadzę się, wspominając o innym sposobie przekazywania nazwanych parametrów do bash ... przechodząc przez referencję. Jest to obsługiwane od wersji bash 4.0
Alternatywną składnią dla bash 4.3 jest użycie nazwy-nazwy
Chociaż nameref jest o wiele wygodniejszy, ponieważ bezproblemowo usuwa dereferencje, niektóre starsze obsługiwane dystrybucje wciąż wysyłają starszą wersję, więc jeszcze go nie polecę.
źródło