Definicja zmiennej w bash przy użyciu lokalnego słowa kluczowego

33

Uczę się skryptów bash i znalazłem to na moim / usr / share / bash-complete, wiersz 305:

local cword words=()

Co to robi? Wszystkie samouczki online są tylko w formacie

local var=value
Alexandre Santos
źródło

Odpowiedzi:

92

Chociaż podoba mi się odpowiedź udzielona przez jordanm , myślę, że równie ważne jest pokazanie mniej doświadczonym Linuxużytkownikom, jak samodzielnie radzić sobie z takimi pytaniami.

Sugerowany sposób jest szybszy i bardziej wszechstronny niż szukanie odpowiedzi na losowych stronach wyświetlanych na stronie wyników wyszukiwania Google.

Po pierwsze, wszystkie polecenia, które można uruchomić Bashbez wpisywania wyraźnej ścieżki do niego, takie jak, ./commandmożna podzielić na dwie kategorie: Bash shell builtinsi external commands. Bash shell builtinspochodzą z Bashi są jego częścią, a external commandsnie są częścią Bash. Jest to ważne, ponieważ Bash shell builtinssą dokumentowane wewnątrz, man basha ich dokumentację można również wywoływać za pomocą helppolecenia, podczas gdy external commandszwykle są one dokumentowane samodzielnie manpageslub zabierają króla -h, --helpflagi. Aby sprawdzić, czy polecenie jest Bash shell builtinalbo external command:

$ type local
local is a shell builtin

Wyświetli się how command would be interpreted if used as a command name(z help type). Tutaj widzimy, że localjest to shell builtin. Zobaczmy inny przykład:

$ type vim
vim is /usr/bin/vim

Tutaj widzimy, że vimnie jest shell builtinto zewnętrzne polecenie znajdujące się w /usr/bin/vim. Czasami jednak to samo polecenie może być zainstalowane zarówno jako, jak external commandi shell builtinjednocześnie. Dodaj -ado typelisty wszystkich możliwości, na przykład:

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo

Tutaj widzimy, że echojest to zarówno a, jak shell builtini an external command. Jednakże, jeśli właśnie wpisałeś echoi nacisnąłeś Returna shell builtin, zostanie wywołany, ponieważ pojawia się jako pierwszy na tej liście. Pamiętaj, że wszystkie te wersje echonie muszą być takie same. Na przykład w moim systemie /usr/bin/echotrwa --helpflaga, a builtinnie.

Ok, teraz kiedy wiemy, że localjest to wbudowana powłoka, dowiedzmy się, jak to działa:

$ help local
local: local [option] name[=value] ...
Define local variables.

Create a local variable called NAME, and give it VALUE.  OPTION can
be any option accepted by `declare'.

Local variables can only be used within a function; they are visible
only to the function where they are defined and its children.

Exit Status:
Returns success unless an invalid option is supplied, an error occurs,
or the shell is not executing a function.

Należy zwrócić uwagę na pierwszą linię: name[=value]. Wszystko pomiędzy [i ]jest opcjonalne . Jest to powszechna konwencja stosowana w wielu manpagesdokumentach na *nixcałym świecie. Biorąc to pod uwagę, polecenie, o które pytałeś w swoim pytaniu, jest całkowicie legalne. Z kolei ...znak oznacza, że ​​można powtórzyć poprzedni argument. Możesz także przeczytać o tej konwencji w niektórych wersjach man man:

The following conventions apply to the SYNOPSIS section and can be used
as a guide in other sections.

bold text          type exactly as shown.
italic text        replace with appropriate argument.
[-abc]             any or all arguments within [ ] are optional.
-a|-b              options delimited by | cannot be used together.
argument ...       argument is repeatable.
[expression] ...   entire expression within [ ] is repeatable.

Tak więc na koniec dnia mam nadzieję, że teraz łatwiej będzie ci zrozumieć, jak działają różne polecenia Linux.

Arkadiusz Drabczyk
źródło
5
Bardzo miła odpowiedź. Czytałem to, mając nadzieję, że zwrócisz uwagę na to, jak początkujący może sam odkryć, jakie było przypisanie tablicy, po prostu z kodu var=(), ale przypuszczam, że jest to trochę dużo do zrobienia, nawet nie znając nazwy tego, czego szukasz . ;)
Wildcard
Czy powłoki non-bash również obsługują local?
palswim
2
Zalogowałem się tylko po to, aby głosować za odpowiedzią :)
Harendra Singh
@Wildcard Ponieważ tablica jest składnią bashową w przeciwieństwie do polecenia, można ją zdefiniować w man bash. Na miejscu wpisz, /Arrays$aby przejść do sekcji tablic. (Następujące $po Arraysto, aby zapobiec przewijaniu w tekście odwołań do sekcji.) Stamtąd możesz wpisać, faby przejść do przodu lub bdo tyłu. Wpisz, qaby wyjść ze strony podręcznika po zakończeniu.
Taylor Edmiston
Również działa helpbez args będzie lista wszystkich poleceń wbudowanych bash, jeśli jesteś ciekaw, aby zobaczyć więcej.
Taylor Edmiston
29

Słowo localkluczowe może przyjmować wiele zmiennych. Podanie zmiennej wartości jest opcjonalne. Twój przykład deklaruje dwie zmienne cwordi words. wordsZmienna jest przyporządkowana pustą tablicę.

Jordan
źródło
18

localpo prostu deklaruje, że zmienna ma zasięg tylko w aktualnie zdefiniowanej funkcji, tak że główne środowisko wykonawcze nie może „zobaczyć” wartości. Nie można używać localpoza funkcją. Przykład

func() {
   nonlocal="Non local variable"
   local onlyhere="Local variable"
}
func
echo $nonlocal 
echo $onlyhere

Dane wyjściowe: zmienna nielokalna

Więc $onlyherenie było widoczne poza zakresem funkcji.

Otheus
źródło
Ta odpowiedź jest bardziej sensowna dla tych, którzy potrzebują szybkiego zrozumienia.
Alex Raj Kaliamoorthy