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

OP #7420177

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

Gast #7420214

Schmeiss den Kurs weg wenn er das nicht vorher erklärt hat, der taugt nix So obskure bashkonstrukte verwendet in der Praxis niemand, ein weiterer Grund diesen Kurs wegzuwerfen.

#7420248

Herbert B. schrieb:

So obskure bashkonstrukte verwendet in der Praxis niemand, ein weiterer Grund diesen Kurs wegzuwerfen.

Wenn man sich entschliesst, in signifikantem Umfang Shell-Scripte zu schreiben, oder jene anderer Leute zu lesen, wird man solchen Konstrukten schon begegnen. Als Teil eines genannten Einstiegskurs Linux sehe ich das aber nicht.

#7420280

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

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

Eine eigene Frage? Dieser Thread ist über 3 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.