Bash-Frage für Python-Programmierer

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
buhtz
Beiträge: 1106
Registriert: 04.12.2015 17:54:49
Kontaktdaten:

Bash-Frage für Python-Programmierer

Beitrag von buhtz » 30.08.2023 12:12:06

Ich versuche nachzuvollziehen, was dieses Stück Bash-Code tut.

Code: Alles auswählen

onTravis() {
    [ "${TRAVIS}" = "true" ]
}
Es ist eine Funktion.
Es geht um die Environment-Variable "TRAVIS".

Warum die eckigen Klammern?
Und ist das "=" eine Zuweisung oder ein test?

Ich weiß nicht mal, wie ich addhoc den Rückgabewert testen soll.
Debian 11 & 12; Desktop-PC, Headless-NAS, Raspberry Pi 4
Teil des Upstream Betreuer Teams von Back In Time (Debianbackintime)

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash-Frage für Python-Programmierer

Beitrag von heisenberg » 30.08.2023 12:45:18

Das >>> = <<< ist ein Vergleichsoperator.

Das ist eine Funktion, die anzeigt ob die Variable TRAVIS die Zeichenkette "true" enthält. Die eckigen Klammern sind die übliche Version für die Auswertung von Ausdrücken.

Du kannst das so verwenden:

Code: Alles auswählen

if onTravis ; then

	echo "Travis ist eingeschaltet"

else

	echo "Travis ist nicht eingeschaltet"

fi
... was equivalent ist zu ...

Code: Alles auswählen

if [ "${TRAVIS}" = "true" ] ; then

	echo "Travis ist eingeschaltet"
else

	echo "Travis ist nicht eingeschaltet"

fi
Ansonsten liefert das Konstrukt [ ... ] immer einen Exit-Code zurück, also hauptsächlich 0 (trifft zu) oder 1 (trifft nicht zu).

In der Funktion ist der Exit-Code implizit. D. h. der Exit-Code des zuletzt ausgeführten Befehls wird an das aufrufende Programm zurückgeliefert.
Zuletzt geändert von heisenberg am 30.08.2023 12:54:46, insgesamt 4-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

tobo
Beiträge: 1997
Registriert: 10.12.2008 10:51:41

Re: Bash-Frage für Python-Programmierer

Beitrag von tobo » 30.08.2023 12:46:10

Die (einfachen) eckigen-Klammern ersetzen einen Stringvergleich (=) in test (siehe `man test').
Einmal richtig und einmal falsch auf 2 verschiedenen Arten ausgewertet:

Code: Alles auswählen

$ TRAVIS=true
$ onTravis 
$ echo $?
0        ## 0 entspricht true!
$ TRAVIS=True
$ if onTravis; then echo TRUE; else echo FALSE; fi
FALSE
$

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash-Frage für Python-Programmierer

Beitrag von Meillo » 30.08.2023 12:51:25

Die oeffnende eckige Klammer ist in der Shell ein Alias fuer den Befehl `test'. Folglich steht in der Funktion der Befehl:

Code: Alles auswählen

test "$TRAVIS" = true
Das ist ein Stringvergleich. Ist der Wert der Variable `$TRAVIS' gleich ``true'', dann liefert `test' einen Returncode von 0 (das bedeutet erfolgreich), sonst 1 (das bedeutet fehlgeschlagen).

Es ist also ein Test. (Zuweisungen duerfen in der Shell keinen Whitespace um das Gleichzeichen haben und stehen am Zeilenanfang oder hinter `export'.)

Den Rueckgabewert des vorigen Kommandos kannst du mit `echo $?' ausgeben lassen. Also einfach diesen Befehl unter dem test-Befehl einfuegen, dann sollte eine 1 oder 0 ausgegeben werden.

Seltsam ist allerdings, dass mit dem Rueckgabewert des test-Kommandos gar nichts gemacht wird. Ich koennte mir nur vorstellen, dass am Anfang des Scripts `set -e' gesetzt ist und dadurch bei fehlgeschlagenem Vergleich automatisch abgebrochen wird. So aus dem Kontext gerissen ist der Sinn des Konstrukts schwer nachvollziehbar.


Edit: Andere waren schneller. ;-)
Use ed once in a while!

Antworten