[[ -v var ]] se comporta de manera diferente dentro del script bash frente a CLI

[[ -v var ]] se comporta de manera diferente dentro del script bash frente a CLI

Quiero un script bash que establezca varias variables de entorno (ID de usuario, contraseña, token) en algunos valores predeterminados si aún no existen. La prueba de existencia funciona en la CLI pero no en el script.

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

Respuesta1

Aparentemente varestá configurado en su shell interactivo (aunque no está en el entorno). Luego [[ -v var ]]devuelve el éxito y echo "\${var} not defined"se ejecuta.

Verás not definedporque la lógica de tu código es incorrecta.

En el script varno está configurado, [[ -v var ]]devuelve error y echo "\${var} is defined"se ejecuta.

Ya ves is definedporque nuevamente la lógica está equivocada. La siguiente lógica tiene sentido:

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

Es opuesto a la lógica de su código.

información relacionada