PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash script frage


chetigol
2019-01-09, 09:54:12
Hi,

ich lese mich gerade in bash ein und hätte frage zu folgendem Konstrukt - genauer zum : - Operator.

Ich hab schon herausgefunden, dass dies eine Art nop / pass Anweisung ist. Ich würde gerne den Zusammenhang in folgendem Kontext verstehen:


: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}

Ich verstehe, dass es sich um eine Initialisierung der Variable OCF_FUNCTIONS_DIR handelt - wieso aber auf diese Weise?

Wieso nicht einfach folgendes schreiben?


OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat


Ps
Der Code ist von einem OCF Resource Agent

nalye
2019-01-09, 12:50:30
Der ist das Aequivalent zu true. No-op eher bei einer if-Schleife

chetigol
2019-01-09, 13:10:46
was bringt mir dann in einem Script das TRUE an genau dieser Stelle?
Der Vergleich der beiden Zuweisungen

Wieso wird im Scriptfile auf diese Weise zugewiesen?


: ${OCF_RESKEY_fake=dummy}
: ${OCF_RESKEY_op_sleep=0}
: ${OCF_RESKEY_CRM_meta_interval=0}
: ${OCF_RESKEY_CRM_meta_globally_unique:="false"}


und nicht einfach?


OCF_RESKEY_fake=dummy
OCF_RESKEY_op_sleep=0
OCF_RESKEY_CRM_meta_interval=0
OCF_RESKEY_CRM_meta_globally_unique:="false"


Wo liegt der Vorteil vom ersteren?
Was ist der Zweck?

Marscel
2019-01-09, 19:34:32
Deine Umgebungsvariablen werden so nur definiert, falls sie es noch nicht sind, anderfalls passiert nichts.

Fallbacks, quasi.

fezie
2019-01-09, 19:53:35
Ich denke das mit : spielt vor allem eine Rolle mit set -e
Also das bei einem Returncode != 0 sofort das Script abgebrochen wird.

${var=inhalt} gibt 1 zurück wenn $var bereits definiert ist. Der Inhalt also nicht überschrieben wird.
Und beim : wird das in 0 geändert.

chetigol
2019-01-09, 20:00:53
Deine Umgebungsvariablen werden so nur definiert, falls sie es noch nicht sind, anderfalls passiert nichts.

Fallbacks, quasi.

super, das hab ich jetzt ausprobiert! Hast recht. So ist es!

Jetzt würde ich gerne wissen, wie man die Anweisung liest - grab gerade in den man-pages herum.

chetigol
2019-01-09, 20:01:48
Ich denke das mit : spielt vor allem eine Rolle mit set -e
Also das bei einem Returncode != 0 sofort das Script abgebrochen wird.

${var=inhalt} gibt 1 zurück wenn $var bereits definiert ist. Der Inhalt also nicht überschrieben wird.
Und beim : wird das in 0 geändert.

ich starte aber das script nicht mit set -e
aber ich werd mich da herumspielen

danke

chetigol
2019-01-09, 20:21:56
ok, ich glaube, ich habe es verstanden - bitte um berichtigung, falls ich falsch liegen sollte.

die Anweisung selbst, so wie es Marscel geschrieben hat, ist eine bedingte zuweisung:


${var=value}


das Problem ist, wenn diese Zuweisung für sich steht, meldet bash einen Fehler, da das jeweilige kommando nicht existiert - abhängig vom value - bash versucht den Inhalt von var auszuführen

Durch das voranstellen des ":" wird die negative Antwort des kommandos in ein TRUE umgewandelt


${myvar=4}


führt zur Ausgabe


./bash_test.sh: line 5: 4: command not found


Mit vorangestelltem : gibt es keine Fehlermeldung

fezie
2019-01-09, 21:40:49
Ah. Ich hab es vorhin nur interaktiv getestet.
Und da geht ${xxx=yyy} ohne :

chetigol
2019-01-10, 07:38:36
Ah. Ich hab es vorhin nur interaktiv getestet.
Und da geht ${xxx=yyy} ohne :

funktionieren tut es auch in der bash. Das Programm läuft durch - nur ohne : gibt er an dieser Stelle die Warnung aus - und läuft weiter