2012-07-27 25 views
29

Estoy escribiendo un script de shell, donde tengo que verificar si la variable de entorno está configurada, si no está configurada, entonces tengo que configurarla. ¿Hay alguna manera de verificar el script de shell, ya sea que una variable de entorno ya esté configurada o no?compruebe si la variable de entorno ya está configurada

+0

En realidad, este no es un verdadero duplicado de esa pregunta: el OP aquí quiere saber si se estableció una variable, y si no se hace algo al respecto, en lugar de salir de un script. $ {V :?} no es una respuesta válida en ese caso. 'conjunto | grep -q '^ V =' 'es. Esto prueba la presencia de la variable y funciona incluso si la variable se estableció, pero a la cadena vacía. – Coroos

Respuesta

27
[ -z "$VARIABLE" ] && VARIABLE="abc" 

if env | grep -q ^VARIABLE= 
then 
    echo env variable is already exported 
else 
    echo env variable was not exported, but now it is 
    export VARIABLE 
fi 

Quiero hacer hincapié en que [ -z $VARIABLE ] no es suficiente, porque puede tener VARIABLE pero no se exportó. Eso significa que no es una variable de entorno en absoluto.

+0

¿Funcionará esto en todos los entornos de shell? – Mojoy

+0

@Senthilnathan: sí, por supuesto, lo único que podría reescribirse para hacer que este código sea más portátil es 'grep -q'. Uno podría escribir 'env | grep^VARIABLE =>/dev/null' en su lugar. –

+0

Si exporto una variable, luego establezco la variable en otra cosa sin exportarla, ¿termino con una discrepancia entre mi variable no exportada y mi variable exportada, o también actualizará automágicamente la exportada? – ArtOfWarfare

7
if [ -z "$VARIABLE" ]; then 
    VARIABLE=... 
fi 

Esto comprueba si la longitud de $ VARIABLE es cero.

13

Lo que se quiere hacer es nativa en bash, se denomina sustitución de parámetros:

VARIABLE="${VARIABLE:=abc}" 

Si la variable no está definida, lado derecho será igual a ABC. Tenga en cuenta que el operador interno: = puede reemplazarse por: - que comprueba si VARIABLE no está configurado o vacío.

+0

Exactamente lo que estaba buscando. La línea 'export TEST_DATABASE_NAME =" $ {TEST_DATABASE_NAME: = prodlike} "' solo usará prodlike como valor predeterminado si TEST_DATABASE_NAME no estuviera definido. Sin bloques condicionales desordenados. Todo en una línea de código. –

46

La solución estándar para asignar una variable condicional (ya sea en el entorno o no) es:

: ${VAR=foo} 

que establecerá VAR para el valor "foo" sólo si no está definido.
Para establecer VAR para "foo" si var no está definido o la cadena vacía, utilice:

: ${VAR:=foo} 

Para poner VAR en el medio ambiente, el seguimiento con:

export VAR 

También se puede hacer export VAR=${VAR-foo} o export VAR=${VAR:=foo}, pero algunos shells antiguos no son compatibles con la sintaxis de asignación y exportación en la misma línea. Además, DRY; usar el nombre en ambos lados del operador = es una repetición innecesaria. (Una segunda línea que exporta la variable infringe el mismo principio pero se siente mejor).

Tenga en cuenta que, en general, es muy difícil determinar si una variable está en el entorno. El análisis de la salida env no funcionará. Considere:

export foo=' 
VAR=var-value' 
env | grep VAR 

Tampoco funciona para generar un subnivel y la prueba:

sh -c 'echo $VAR' 

que indicarían el VAR se encuentra en el subnivel, lo que sería un indicador de que VAR está en el entorno de el proceso actual, pero puede ser simplemente que VAR esté configurado en la inicialización de la subshell. Funcionalmente, sin embargo, el resultado es el mismo que si VAR está en el entorno. Afortunadamente, generalmente no te importa si VAR está en el medio ambiente o no. Si lo necesitas allí, ponlo allí. Si lo necesita, sáquelo.

+0

¿Podría agregar una explicación de cómo funciona la notación ': $ {VAR: = foo}' internamente? Siempre lo encuentro como LA solución, pero nunca CÓMO realmente funciona. –

+1

Encontré alguna explicación sobre [StackOverflow] (http://stackoverflow.com/questions/4437573/bash-assign-default-value)! –

Cuestiones relacionadas