Ich versuche, eine Funktion in bash zu schreiben, die auf die Befehlszeilenargumente der Skripte zugreift, aber sie werden durch die Positionsargumente für die Funktion ersetzt. Gibt es eine Möglichkeit für die Funktion, auf die Befehlszeilenargumente zuzugreifen, wenn diese nicht explizit übergeben werden?
# Demo function
function stuff {
echo $0 $*
}
# Echo's the name of the script, but no command line arguments
stuff
# Echo's everything I want, but trying to avoid
stuff $*
bash
command-line-arguments
argv
DonGar
quelle
quelle
$*
ist extrem buggy - es wird sich ändern./yourScript "first argument" "second argument"
zu./yourscript "first" "argument" "second" "argument"
, ändern oder./yourscript '*.txt'
zu so etwas wie./yourscript one.txt two.txt
trotz der Zitate.Antworten:
Meine Lektüre des Bash-Ref-Handbuchs besagt, dass dieses Zeug in BASH_ARGV erfasst ist, obwohl es viel über "den Stapel" spricht.
Speichern in f.sh.
quelle
Wenn Sie möchten, dass Ihre Argumente den C-Stil haben (Array von Argumenten + Anzahl der Argumente), können Sie
$@
und verwenden$#
.$#
gibt Ihnen die Anzahl der Argumente.$@
gibt Ihnen alle Argumente. Sie können dies durch in ein Array verwandelnargs=("$@")
.Also zum Beispiel:
Beachten Sie, dass hier
${args[0]}
tatsächlich das erste Argument und nicht der Name Ihres Skripts angegeben ist.quelle
args
Array innerhalb einer Funktion verwenden, wenn Sie es zuvor wie beschrieben initialisieren.echo "${args[0]} ${args[1]} ${args[2]}"
, oder die Argumente unterliegen einer Dateinamenerweiterung.Bearbeiten: siehe meinen Kommentar zur Frage
quelle
Ravis Kommentar ist im Wesentlichen die Antwort. Funktionen haben ihre eigenen Argumente. Wenn Sie möchten, dass sie mit den Befehlszeilenargumenten identisch sind, müssen Sie sie übergeben. Andernfalls rufen Sie eindeutig eine Funktion ohne Argumente auf.
Sie können die Befehlszeilenargumente jedoch in einem globalen Array speichern, um sie in anderen Funktionen zu verwenden:
Sie müssen über die
commandline_args
Variable auf die Befehlszeilenargumente zugreifen , nicht$@
,$1
,$2
etc., aber sie sind vorhanden. Ich kenne keine Möglichkeit, das Argumentarray direkt zuzuweisen, aber wenn jemand eines kennt, klären Sie mich bitte auf!Beachten Sie auch die Art und Weise, wie ich verwendet und zitiert habe
$@
- so stellen Sie sicher, dass Sonderzeichen (Leerzeichen) nicht durcheinander geraten.quelle
quelle
Das kann man auch so machen
Rufen Sie jetzt Ihr Skript wie auf
quelle
function print() {
ist ein Amalgam zwischen zwei verschiedenen Funktionsdeklarationsformen -function print {
eine Legacy-ksh-Syntax, die bash unterstützt, um die Abwärtskompatibilität mit Pre-POSIX (dh vor 1991) ksh zu gewährleisten, undprint() {
die POSIX-standardisiert ist. Erwägen Sie die Verwendung des einen oder anderen, um eine bessere Kompatibilität mit anderen Schalen zu gewährleisten. siehe auch wiki.bash-hackers.org/scripting/obsoleteSie können das Schlüsselwort shift (Operator?) Verwenden, um sie zu durchlaufen. Beispiel:
quelle
function print() {
ist ein Amalgam zwischen zwei verschiedenen Funktionsdeklarationsformen -function print {
eine ältere ksh-Syntax, die bash unterstützt, um die Abwärtskompatibilität mit ksh vor POSIX (dh vor 1991) zu gewährleisten, undprint() {
die POSIX-standardisiert ist. Erwägen Sie die Verwendung des einen oder anderen, um eine bessere Kompatibilität mit anderen Schalen zu gewährleisten. siehe auch wiki.bash-hackers.org/scripting/obsoleteMeine Lösung:
Erstellen Sie ein Funktionsskript, das früher als alle anderen Funktionen aufgerufen wird, ohne Argumente wie folgt zu übergeben:
Danach können Sie init aufrufen und die ORIGOPT-Variable nach Bedarf verwenden. Als Plus ordne ich immer eine neue Variable zu und kopiere den Inhalt von ORIGOPT in meine neuen Funktionen. Auf diese Weise können Sie sicher sein, dass niemand sie berühren wird oder ändern Sie es.
Ich habe Leerzeichen und Bindestriche hinzugefügt, um das Parsen mit 'sed -E' zu vereinfachen. Bash wird es nicht als Referenz übergeben und ORIGOPT wachsen lassen, wenn Funktionen mit mehr Argumenten aufgerufen werden.
quelle