Gibt es eine Möglichkeit, Positionsargumente in bash zu vermeiden?
Muss ich eine Funktion schreiben, die in der bash. Die Funktion wird über 7 Argumente. Ich weiß, dass ich eine Funktion aufrufen wie diesem:
Aufruf einer Funktion mit Parametern:
function_name $arg1 $arg2
Und ich kann beziehen sich meine Parameter, wie dies innerhalb der Funktion:
function_name () {
echo "Parameter #1 is $1"
}
Meine Frage ist, gibt es einen besseren Weg finden, um den Parameter innerhalb der Funktion? Kann ich vermeiden, dass die $1, $2, $3, .... Ding und benutzt einfach das $arg1, $arg2, ...?
Gibt es eine richtige Methode oder muss ich die neu ordnen Sie diese Parameter, um einige der anderen Variablen innerhalb der Funktion? E. g.:
function_name () {
$ARG1=$1
echo "Parameter #1 is $ARG1"
}
Jedes Beispiel, das wäre sehr geschätzt werden.
InformationsquelleAutor der Frage Bhushan | 2012-08-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den gemeinsamen Weg, das zu tun, ist die Zuordnung der Argumente zu den lokalen Variablen in der Funktion, d.h.:
Andere Lösung kann sein getopt-Stil-option parsing.
Leider bash nicht umgehen kann, lange Optionen, die würde mehr lesbar, d.h.:
Dafür benötigen Sie entweder die externe
getopt
Programm (was ich denke hat lange option unterstützt nur auf GNU-Systemen) oder die Umsetzung des lange option-parser von hand, D. H.:Siehe auch: Verwendung von getopts in bash-shell-Skript, um long-und short-Kommandozeilen-Optionen
Können Sie auch faul sein, und einfach die 'Variablen', die als Argumente an die Funktion, also:
und Sie haben
${from}
und${to}
in der Funktion als lokale Variablen.Nur beachten, dass das gleiche Problem wie unten gilt — wenn eine bestimmte variable wird nicht übergeben, es wird vererbt vom übergeordneten Umwelt. Sie können hinzufügen, ein "safety-line" wie:
um sicherzustellen, dass
${from}
und${to}
werden gelöscht, wenn Sie nicht bestanden.Und wenn etwas sehr schlecht von Ihrem Interesse ist, Sie könnte auch die Zuordnung der Argumente als Globale Variablen beim Aufruf der Funktion, d.h.:
Dann könnte man nur verwenden
${from}
und${to}
innerhalb dercopy()
Funktion. Beachten Sie, dass nur Sie sollte dann immer alle übergeben Parameter. Andernfalls wird eine zufällige variable kann Leck in der Funktion.Wenn Sie die bash-4.1 (glaube ich), Sie können auch versuchen, mit assoziativen arrays. Es wird Ihnen erlauben, benannte Argumente übergeben, aber es wird hässlich. So etwas wie:
Und dann in
copy()
müssten Sie schnappen Sie sich das array.InformationsquelleAutor der Antwort Michał Górny
Können Sie immer passieren Dinge, die durch die Umwelt:
InformationsquelleAutor der Antwort William Pursell
Shell-Funktionen haben vollen Zugriff auf alle Variablen in der aufrufenden Bereichs, außer für diejenigen Variablen-Namen, die als lokale Variablen innerhalb der Funktion selbst. Darüber hinaus werden nicht-lokale Variablen innerhalb einer Funktion verfügbar ist, auf der Außenseite nach dem die Funktion aufgerufen wurde. Betrachten Sie das folgende Beispiel:
Diesem snippet hat die folgende Ausgabe:
Der offensichtliche Nachteil dieses Ansatzes ist, dass die Funktionen sind nicht in sich abgeschlossen, und die Einstellung eine variable außerhalb einer Funktion kann unerwünschte Nebenwirkungen. Würde es auch machen die Dinge schwieriger, wenn Sie wollten, die zum übergeben von Daten an eine Funktion ohne Zuweisung an eine variable zuerst, da diese Funktion nicht über Parameter mehr.
Der häufigste Weg, um dies zu umgehen, ist die Verwendung lokale Variablen für Argumente und eine temporäre variable innerhalb einer Funktion:
Dies vermeidet das verschmutzen der shell-namespace mit der Funktions-lokalen Variablen.
InformationsquelleAutor der Antwort thkala
Ich denke ich habe eine Lösung für Sie.
Mit ein paar tricks können Sie tatsächlich passieren benannte Parameter zu Funktionen mit arrays.
Die Methode, die ich entwickelt, ermöglicht Ihnen den Zugriff auf die Parameter an eine Funktion übergeben, wie hier:
In anderen Worten, nicht nur können Sie rufen Sie Ihre Parameter anhand Ihrer Namen (was einem besser lesbaren core), kann man eigentlich das übergeben von arrays (und Verweise auf Variablen - diese Funktion funktioniert nur in der bash 4.3)! Plus, die zugeordneten Variablen sind alle im lokalen Bereich, nur als $1 (und andere).
Den code, der macht diese Arbeit ist ziemlich Licht und arbeitet sowohl in bash-3-und bash-4 (nur diese Versionen habe ich getestet). Wenn Sie interessiert sind, mehr tricks wie diese, machen die Entwicklung mit der bash viel schöner und einfacher wird, können Sie einen Blick auf meine Bash-Infinity-Frameworkden code unten ein speziell für diesen Zweck.
InformationsquelleAutor der Antwort niieani
Ich persönlich war in der Hoffnung, um zu sehen, eine Art von syntax, wie
Aber da, das ist nicht eine Sache, und ich sehe durchaus ein paar Referenzen auf Globale Variablen (nicht ohne den VORBEHALT der Festlegung des lösungsumfangs und der Benennung von Konflikten), ich werde teilen mein Ansatz.
Mithilfe der
copy
Funktion von Michal ' s Antwort:Das ist schlecht, weil
from
undto
sind solche breiten Worten, dass eine beliebige Anzahl von Funktionen kann mit dieser. Sie könnten schnell am Ende mit einem Namenskonflikt oder ein "Leck" auf Ihre Hände.Also mein Ansatz ist es, "namespace". Ich nenne die variable nach der Funktion und löschen Sie Sie, nachdem die Funktion fertig ist. Natürlich, ich verwenden Sie nur für optionale Werte, die Standardwerte haben. Ansonsten benutze ich nur positionale Argumente.
Ich würde einen schrecklichen Chef...
In der Praxis, meine Funktions-Namen sind aufwändiger, als "Kopie" oder "Brief".
Jüngstes Beispiel, um mein Gedächtnis ist
get_input()
diegi_no_sort
undgi_prompt
.gi_no_sort
ist ein true/false-Wert, der bestimmt, ob der Abschluss Vorschläge sortiert sind oder nicht. Standardmäßig auf truegi_prompt
ist ein string, der ist...naja, das ist selbsterklärend. Defaults to "".Die eigentlichen Argumente der Funktion sind die Quelle der oben genannten "Vollendung Vorschläge" für die input-Eingabeaufforderung, und wie gesagt, die Liste ist entnommen aus
$@
in der Funktion, die "benannte Argumente" sind optional[1]und es gibt keine offensichtliche Möglichkeit, zu unterscheiden zwischen einem string soll als ein Abschluss und ein boolean - /prompt-Nachricht, oder wirklich alles, was durch Leerzeichen getrennte in bash, für diese Angelegenheit[2]; die oben genannte Lösung endete spart mir viel ärger.Hinweise:
So eine hart codierte
shift
und$1
$2
usw. Frage.E. g. ist
"0 Enter a command: {1..9} $(ls)"
einen Wert von0
"Enter a command:"
und eine Reihe von1 2 3 4 5 6 7 8 9 <directory contents>
? Oder sind"0"
"Enter"
"a"
und"command:"
Teil von diesem Satz? Die Bash übernimmt die letzteren, ob Sie es wollen oder nicht.InformationsquelleAutor der Antwort Braden Best
Alles, was Sie tun müssen ist name der Variablen, auf die Art und Weise, in der diese Funktion aufgerufen wurde.
Dies ist nicht nur eine Funktion von Funktionen, die Sie haben könnten, dass die Funktion in einem eigenen script und nennen
a='hello world' test.sh
und es würde ganz genauso funktionierenAls extra bisschen Spaß zu haben, können Sie kombinieren diese Methode mit positions-Argumenten (sagen Sie wurden ein Skript und einige Nutzer vielleicht nicht wissen, die Namen von Variablen).
Herrje, warum lassen Sie es nicht, Standardwerte für diese Argumente zu? Na sicher, einfach kinderleicht!
Beachten Sie, dass, wenn
test
war seine eigene Skripts, die Sie nicht brauchen, um verwenden Sie dielocal
Stichwort.InformationsquelleAutor der Antwort Hashbrown
Argumente zugeschickt bekommen Funktionen als ein Tupel aus einzelnen Elementen, so haben Sie keine Namen, als solche, die nur Positionen. dies ermöglicht einige interessante Möglichkeiten, wie unten, aber es bedeutet, dass Sie stecken mit $1. $2, usw. ob Karte Sie besser auf die Namen, kommt die Frage auf, wie gross die Funktion ist, und wie viel deutlicher machen wird, Lesen Sie den code. wenn seine komplexe, Kartierung aussagekräftige Namen ($BatchID, $FirstName, $SourceFilePath) ist eine gute Idee. für die einfachen Sachen aber, es ist wahrscheinlich nicht notwendig. Ich certianly würde nicht stören, wenn Sie mit Namen wie $arg1.
nun, wenn Sie wollen einfach nur echo zurück, die Parameter, Sie können Durchlaufen Sie diese:
nur ein fun-fact ist, es sei denn, Sie Bearbeiten die Liste, sind Sie wahrscheinlich daran interessiert, etwas mehr nützlich
InformationsquelleAutor der Antwort Frank Thomas
dies ist ein älteres Thema, aber trotzdem möchte ich die Funktion unten (benötigt bash-4). Es analysiert benannte Argumente und setzt die Variablen in den Scripten Umgebung. Nur stellen Sie sicher, Sie haben vernünftige Vorgabewerte für alle Parameter, die Sie benötigen. Die export-Anweisung am Ende könnte auch nur ein eval. Es ist toll in Kombination mit der shift-Erweiterung bestehender Skripte, die schon ein paar positionelle Parameter und Sie nicht möchten, ändern Sie die syntax, aber noch eine gewisse Flexibilität.
InformationsquelleAutor der Antwort mkrzewic