Linux NewBe lernt - was macht ${DEBUG:+echo "argv: " $@}

OP #7420177
Lesenswert?

Hallo zusammen,

ich mache einen Einstiegskurs Linux und versuche einige Beispiele aus den Unterlagen nach zu vollziehen.

Den schaffe ich nicht zu verstehen

1
#!/bin/bash
2
# naechste Zeile auskommentieren,
3
# um Debug-Ausgabe abzuschalten
4
DEBUG=1
5
${DEBUG:+echo "argv: " $@}
6
# Pruefung auf Vorhandensein von Uebergabeparameter 1
7
firstarg=${1:?usage $0 arg1 [arg2]}
8
${DEBUG:+echo "firstarg: " $firstarg}

Insbesondere

  1. ${DEBUG:+echo "argv: " $@} und
  2. firstarg=${1:?usage $0 arg1 [arg2]}

zu 1) und wie ich es mir aus meinen Unterlagen "zusammendenken" DEBUG ist die variable, :+ ist ein Shellausdruck der echo "argv: " $@ liefert, falls DEBUG nicht NULL ist. Ich habe keine Vorstellung, was echo "argv: " $@ sein sollte - nur, das echo etwas ausgibt, aber damit komme ich gedanklich nicht weiter

zu 2) 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. Was ich in seiner Aussage aber nicht begreife, weil wie oben keine Idee was das bedeutet.

Grüziwoll

#7420280
Lesenswert?

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.

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

1
argv:  "<parameter>..."

Ziemlich miese Nummer das einem Anfänger vorzusetzen.

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

Gast #7420350
Lesenswert?

Das ":+" ist tatsächlich an mir vorübergegangen, vermutlich mal vor Jahren entdeckt dann doch wieder schnell vergessen. Im Advanced Bash-Scripting Guide ist es auch drinn, denn ich immer wieder nutze. Gerade mal über fremde Scripte gegrepped, das wird doch recht oft verwendet und ist auch zugegeben sehr praktisch weil kürzer.

Man lernt nie aus.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren