Parsen / Übergabe von Befehlszeilenargumenten an ein Bash-Skript - was ist der Unterschied zwischen "$ @" und "$ *"?

8

Ich verwende ein Bash-Skript, um eine .jar -Datei von einem beliebigen Ort aus aufzurufen und auszuführen, ohne ständig ihren expliziten Pfad eingeben zu müssen.

Die .jar erfordert zusätzliche variable Parameter, die bei der Ausführung angegeben werden müssen, und da diese alles sein können, können sie nicht fest in das Skript codiert werden.

Insgesamt gibt es 3 Variablen, die erste gibt 1 von 2 Aktionen an, die .jar ausführen soll, die zweite gibt eine Zieldatei an, für die diese Aktion ausgeführt werden soll und die dritte gibt den Namen einer Datei an, die die Aktion ist erstellen.

Das Skript, das ich momentan verwende, ist:

%Vor%

Ich weiß sehr wenig über Bash-Skripting, aber während ich nach einer anderen Antwort auf meine Probleme suchte (jetzt behoben), stieß ich auf "$@" und "$*" , wenn ich auf Befehlszeilenargumente referenzierte. Weitere Suchanfragen brachten mich auf diese Seite: How To Wiki: Wie man Befehlszeilenargumente in einem Bash-Skript liest , aber ich kann keine soliden Informationen über diese Argumente finden, ohne durch jede Menge fortgeschrittener Bash-Programmierung waten zu müssen, die weit über meinem Kopf liegt.

Nun, da ich für immer weitergelaufen bin, ist meine Frage relativ einfach:

Kann ich "" "" "" durch "$@" oder "$*" ersetzen, und wenn ja, welches ist das bessere?

Was ist, wenn überhaupt, der Unterschied zwischen diesen Befehlen?

    
Escribblings 20.05.2013, 12:23
quelle

3 Antworten

10

"$@" entspricht "" "" "" usw. "$*" entspricht " " , die Sie nicht zu brauchen scheinen.

Ohne Anführungszeichen gibt es keinen Unterschied, beide entsprechen etc.

    
choroba 20.05.2013, 12:28
quelle
4

$* sind alle Parameter als einzelnes Wort, $@ sind alle Parameter als einzelne in Anführungszeichen gesetzte Zeichenfolge.

Normalerweise benutze ich "$@" , scheint am besten für mich zu funktionieren.

    
mogul 20.05.2013 12:33
quelle
0

$* enthält eine einzelne Zeichenfolge, die aus allen Argumenten besteht, die durch das erste Zeichen von $IFS getrennt sind. Wenn Sie also IFS so einstellen, dass ein Zeichen enthalten ist, das in Ihren Argumenten nicht sinnvoll sein kann (z. B. ein Zeilenumbruch, wenn Sie Dateinamen übergeben), dann können Sie $* und "$@" als funktional gleichwertig betrachten arbeiten unter der Haube anders.

$@ ist im Wesentlichen ein Array aller Argumente. Bei der Übergabe in doppelten Anführungszeichen ( "$@" ) umschließt die Shell individuell jeden Wert im Array mit doppelten Anführungszeichen (eine Ausnahme von der normalen Regel von doppelten Anführungszeichen, die die gesamte Erweiterung von a umschließt Variable).

IIRC, das Verhalten eines blanken $@ ohne Anführungszeichen ist in der POSIX-Spezifikation nicht vollständig angegeben, daher sollte es als undefiniertes Verhalten betrachtet werden. Daher sollten Sie niemals eine leere $@ ohne Anführungszeichen verwenden.

Übrigens, wenn Sie sich vor Version 3 für System V interessieren, gab es einige altertümliche Macken wie sie damit umgegangen sind $@. Diese sind größtenteils von historischem Interesse, aber sie werden Ihnen eine gewisse Wertschätzung dafür geben, wie sich der Standard entwickelte, als die Leute auf Probleme stießen. : -)

    
dgatwood 08.01.2018 19:09
quelle