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


von Jasson J. (jasson)


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

: Bearbeitet durch User
von Jack V. (jackv)


Lesenswert?

Jasson J. schrieb:
> Ich habe keine Vorstellung, was echo "argv: " $@ sein sollte

https://coderwall.com/p/85jnpq/bash-built-in-variables

Generell hat das eher wenig mit Linux, dafür mehr mit der Bash zu tun.

von Herbert B. (Gast)


Lesenswert?

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.

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Herbert B. schrieb:
> So obskure bashkonstrukte verwendet in der Praxis niemand

...die schon recht häufig, wenn man Bash-Scripte schreibt ;-)...

von (prx) A. K. (prx)


Lesenswert?

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.

von Hannes J. (Firma: _⌨_) (pnuebergang)


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.


> 2) 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.

von Herbert B. (Gast)


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.

von Jasson J. (jasson)


Lesenswert?

@ Hannes J
Noch mal explizit vielen Dank für die detailierte Antwort!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.