[[ -v var ]] verhält sich im Bash-Skript anders als in der CLI

[[ -v var ]] verhält sich im Bash-Skript anders als in der CLI

Ich möchte ein Bash-Skript, das mehrere Umgebungsvariablen (Benutzer-ID, Passwort, Token) auf einige Standardwerte setzt, wenn sie noch nicht vorhanden sind. Der Existenztest funktioniert auf der CLI, aber nicht im Skript.

magilla@raspberrypi:~ $ ps -p $$
    PID TTY          TIME CMD
   3005 pts/0    00:00:05 bash
magilla@raspberrypi:~ $ echo "${BASH_VERSION}"
5.1.4(1)-release

magilla@raspberrypi:~ $ env | grep var
magilla@raspberrypi:~ $ [[ -v var ]] && echo "\${var} not defined" || echo "\${var} is defined"
${var} not defined

magilla@raspberrypi:~ $ cat myscript
#!/bin/bash
[[ -v var ]] && echo "\${var} not defined" || echo "\${var} is defined"
magilla@raspberrypi:~ $ bash myscript
${var} is defined
magilla@raspberrypi:~ $ bash < myscript
${var} is defined

Antwort1

Anscheinend varist es in Ihrer interaktiven Shell festgelegt (es ist jedoch nicht in der Umgebung). [[ -v var ]]Gibt dann Erfolg zurück und echo "\${var} not defined"wird ausgeführt.

Sie sehen not defined, weil die Logik Ihres Codes falsch ist.

Ist im Skript varnicht festgelegt, [[ -v var ]]gibt einen Fehler zurück und echo "\${var} is defined"wird ausgeführt.

Sie sehen is defined, die Logik ist wieder einmal falsch. Die folgende Logik ergibt Sinn:

[[ -v var ]] && echo "\${var} is defined" || echo "\${var} not defined"

Es widerspricht der Logik Ihres Codes.

verwandte Informationen