Jasson J. schrieb:
Hallo zusammen,
ich mache einen Einstiegskurs Linux und versuche einige Beispiele aus
den Unterlagen nach zu vollziehen.
Klingt nach einem Kurs wo der Macher demonstrieren will was für ein toller Hecht er ist.
- ${DEBUG:+echo "argv: " $@}
Wenn DEBUG null ist oder nicht gesetzt passiert nichts.
In allen anderen Fällen wird der gesamte Klammer-Ausdruck ${...} durch den Teil nach dem ":+" ersetzt. Dabei wird auch $@ zur Liste der Aufrufparameter expandiert ($@ ist eine spezielle Shell-Variable die diese Liste enthält). Also in etwa
1 |
echo "argv: " "<parameter>..."
|
Das wiederum, weil ${...} syntaktisch dort steht wo man ein Kommando schreiben würde, wird also Kommando ausgeführt. echo gibt einfach Strings auf der Konsole aus. Dann steht auf der Konsole so was wie
Ziemlich miese Nummer das einem Anfänger vorzusetzen.
- firstarg=${1:?usage $0 arg1 [arg2]}
Erster Aufrufparameter wird auf Vorhandensein getestet. Wenn leer oder nicht vorhanden wird eine Fehlermeldung "usage <script path/name> arg1 [arg2]" ausgegeben und das Skript abgebrochen.
Wenn vorhanden und nicht leer erhält firstarg den Wert des ersten Aufrufparameters.
Auch ziemlich übel für Anfänger.
zu 1) und wie ich es mir aus meinen Unterlagen "zusammendenken"
DEBUG ist die variable, :+ ist ein Shellausdruck
Nicht ganz. ":+" ist eine von diversen speziellen Parameter Expansions. Es muss in ${...} stehen. Es ist kein eigenständiger Shellausdruck.
Ich habe keine Vorstellung, was echo "argv: " $@ sein sollte - nur, das
echo etwas ausgibt, aber damit komme ich gedanklich nicht weiter
"argv: " ist ein String und wird so ausgegeben wie er da steht.
$@ ist eine spezielle Shellvariable die die Liste der Kommandozeilen-Argumente enthält mit dem das Skript aufgerufen wurde.
firstarg ist eine Variable, die mit einem Wert versehen wird, der mit
${....} referenziert wird.
1 dürfte die Shell-Variable 1 also das erste Argument sein, was von :?
geliefert wird, falls die Variable 1 nicht NULL ist, sonst wird
usage $0 arg1 [arg2] geliefert.
Fast, "usage $0 arg1 [arg2]" wird nicht geliefert sondern ausgegeben wenn $1 nicht da ist oder leer. Der Variablen firstarg wird in dem Fall nichts zugewiesen, sondern das Skript beendet.
:? ist eine ganz spezielle Parameter Expansion mit diesen Seiteneffekten.
$0 ist der Name und Pfad des Skripts.