Variablendefinition in Bash unter Verwendung des lokalen Schlüsselworts

33

Ich lerne Bash-Scripting und habe dies in meiner / usr / share / bash-Vervollständigung, Zeile 305, gefunden:

local cword words=()

Was tut es? Alle Online-Tutorials haben nur das Format

local var=value
Alexandre Santos
quelle

Antworten:

92

Obwohl ich eine Antwort von Jordan mag, denke ich, dass es genauso wichtig ist, weniger erfahrenen LinuxBenutzern zu zeigen , wie sie mit solchen Fragen selbst umgehen können.

Der vorgeschlagene Weg ist schneller und vielseitiger als das Suchen nach Antworten auf zufälligen Seiten, die auf der Google-Suchergebnisseite angezeigt werden.

Erstens können alle Befehle, die Bashohne Eingabe eines expliziten Pfads eingegeben werden ./commandkönnen, in zwei Kategorien unterteilt werden: Bash shell builtinsund external commands. Bash shell builtinskommen installiert mit Bashund sind teil davon, während external commandsnicht teil davon sind Bash. Dies ist wichtig, da Bash shell builtinsdie Dokumentation im Inneren dokumentiert ist man bashund ihre Dokumentation auch mit einem helpBefehl aufgerufen werden kann, während sie external commandsin der Regel für sich selbst dokumentiert ist manpagesoder einen König der -h, --helpFahnen übernimmt . So überprüfen Sie, ob ein Befehl ein Bash shell builtinoder ein ist external command:

$ type local
local is a shell builtin

Es wird how command would be interpreted if used as a command name(von help type) angezeigt . Hier können wir sehen, dass locala shell builtin. Sehen wir uns ein weiteres Beispiel an:

$ type vim
vim is /usr/bin/vim

Hier sehen wir, dass vimes sich nicht um einen, shell builtinsondern um einen externen Befehl handelt /usr/bin/vim. Manchmal kann jedoch derselbe Befehl gleichzeitig als external commandund als installiert shell builtinwerden. Hinzufügen -a, typeum alle Möglichkeiten aufzulisten, zum Beispiel:

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

Hier können wir sehen, dass echosowohl ein shell builtinals auch ein external command. Allerdings, wenn Sie gerade eingegeben echound drückte Returnein shell builtinhätte genannt werden , da sie zuerst in dieser Liste erscheint. Beachten Sie, dass alle diese Versionen von echonicht identisch sein müssen. Zum Beispiel auf meinem System /usr/bin/echonimmt--help Flagge, während builtinnicht.

Ok, wenn wir jetzt wissen, dass locales sich um eine eingebaute Shell handelt, wollen wir herausfinden, wie es funktioniert:

$ 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.

Beachten Sie die erste Zeile: name[=value]. Alles zwischen [und ]ist optional . Es ist eine weit verbreitete Konvention, die in vielen manpagesDokumentationsformen der *nixWelt verwendet wird. Davon abgesehen ist der Befehl, nach dem Sie in Ihrer Frage gefragt haben, vollkommen legal. ...Zeichen bedeutet wiederum, dass das vorherige Argument wiederholt werden kann. Sie können über diese Konvention auch in einigen Versionen von lesen 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.

Letztendlich hoffe ich, dass Sie jetzt leichter verstehen können, wie die verschiedenen Befehle Linuxfunktionieren.

Arkadiusz Drabczyk
quelle
5
Sehr nette Antwort. Ich habe es durchgelesen und gehofft, Sie könnten selbst var=()herausfinden, wie ein Anfänger die Array-Zuweisung ermittelt hat, nur anhand des Codes . Aber ich nehme an, das ist ein bisschen umständlich, ohne den Namen zu kennen, nach dem Sie suchen . ;)
Wildcard
Unterstützen localauch Nicht-Bash-Shells ?
Palswim
2
Ich habe mich nur angemeldet, damit ich deine Antwort positiv bewerten kann :)
Harendra Singh
@Wildcard Da das Array im Gegensatz zu einem Befehl eine Bash-Syntax hat, finden Sie sie in definiert man bash. Geben Sie dort ein, /Arrays$um zum Abschnitt auf Arrays zu springen. (Die hintere $nach Arraysist mit dem Abschnitt Radfahren durch in-Textverweise zu verhindern.) Von dort können Sie eingeben können fsie auf eine Seite gehen oder brückwärts zu gehen. Geben Sie qFolgendes ein, um die Manpage zu schließen, wenn Sie fertig sind.
Taylor Edmiston
helpWenn Sie ohne Argumente laufen, werden alle Bash-Buildins aufgelistet, wenn Sie mehr sehen möchten.
Taylor Edmiston
29

Das localSchlüsselwort kann mehrere Variablen enthalten. Das Versehen der Variablen mit einem Wert ist optional. Ihr Beispiel deklariert zwei Variablen cwordund words. Der wordsVariablen wird ein leeres Array zugewiesen.

Jordanien
quelle
18

localDeklariert eine Variable einfach so, dass sie nur in der aktuell definierten Funktion Gültigkeitsbereich hat, sodass die ausführende Hauptumgebung den Wert nicht "sehen" kann. Sie können nicht localaußerhalb einer Funktion verwenden. Beispiel

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

Ausgabe: Nicht lokale Variable

War $onlyherealso außerhalb des Funktionsumfangs nicht sichtbar.

Otheus
quelle
Diese Antwort ist sinnvoller, wenn Sie ein schnelles Verständnis benötigen.
Alex Raj Kaliamoorthy