Compruebe si existe una variable de entorno para un usuario con su

Compruebe si existe una variable de entorno para un usuario con su

Estoy en esto desde hace días, necesito verificar si hay un usuario $1 si existe una variable de entorno $2.

Probé algunos casos:

 $ [[ -v a ]] && echo "a ok" || echo "a no"
 a no
 $ [[ -v $HOME ]] && echo "a ok" || echo "a no"
 a no 

(Entonces no (lo probé en Bash > 4.2))

if [ su - ${1} -c "[ -z "${2}" ]" ]

Ahora, estoy probando este enfoque porque no encuentro lo que está mal :/!

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"
su - root -c "echo "$HOME" | wc | sed 's/ //g'"

Respuesta1

La sintaxis de sus primeros ejemplos es incorrecta. Si tú escribes:

[[ -v $HOME ]]

Entonces en realidad estás ejecutando el comando:

[[ -v /home/yourusername ]]

Lo cual por supuesto va a fracasar. Quieres:

[[ -v HOME ]] && echo ok || echo no

Puedes combinar eso con supara obtener:

su - root -c "[[ -v HOME ]]" && echo ok || echo no

Sus últimos ejemplos no funcionarán porque no puede anidar comillas y porque la expansión de la variable de shell ocurre antes de la ejecución del comando. Es decir, dado:

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"

El comando que ejecutes en realidad será:

su - root -c 'echo /home/somesuser | ...'

Si desea el valor de $HOMEdesde la perspectiva de root, deberá evitar la expansión de variables en el shell local, por ejemplo, utilizando comillas simples:

su - root -c 'echo $HOME | ...'

No me queda claro por qué estás pasando el resultado a wc, porque el recuento de palabras $HOMEcasi siempre será 1. En lugar de posprocesar la salida de wcwith sedo cut, puedes usar la -wopción para obtener el recuento de palabras:

su - root -c 'echo $HOME | wc -w'

información relacionada