Me gustaría asegurarme de que en un determinado punto de un script, después source
de crear un archivo de configuración, se establezcan varias variables y, si no lo están, para detener la ejecución, informar al usuario sobre la variable que falta. Yo he tratado
for var in $one $two $three ; do
...
pero si, por ejemplo, $two
no está configurado, el bucle nunca se ejecuta para $two
. Lo siguiente que intenté fue
for var in one two three ; do
if [ -n ${!var} ] ; then
echo "$var is set to ${!var}"
else
echo "$var is not set"
fi
done
Pero si dos no está configurado, sigo obteniendo "dos está configurado en" en lugar de "dos no está configurado".
¿Cómo puedo asegurarme de que todas las variables requeridas estén establecidas?
Actualización / Solución: Sé que hay una diferencia entre "set" y "set, pero vacío". Ahora uso (gracias a /programming//a/16753536/3456281 y las respuestas a esta pregunta) lo siguiente:
if [ -n "${!var:-}" ] ; then
entonces, si var
está configurado pero vacío, todavía se considera inválido.
fuente
set -u
al comienzo de su script para terminarlo inmediatamente cuando se utiliza una variable no establecida.Respuestas:
Error de cita
Para el futuro: configuración
antes de ejecutar el código le habría mostrado el problema. En lugar de agregar eso al código, puede llamar a su script con
fuente
set -- $(IFS=, ; echo $cs)
? El tipo de personas que tienen que preguntar aquí ¿por quéif [ -n ${!var} ] ; then
no funciona? Probablemente no.Lo único que necesita son citas en su prueba:
Funciona para mi.
fuente
Si desea que el programa se detenga:
Eso hará el truco. Cada uno de los mensajes que siguen al signo de interrogación se imprime
stderr
y el shell principal muere. Bueno, está bien, así que no cada mensaje, solo uno, solo el primero que falla imprime un mensaje porque el shell muere. Me gusta usar estas pruebas así:Tenía mucho más que decir sobre esto aquí .
fuente
Puedes añadir
al comienzo de su secuencia de comandos para que finalice cuando intente utilizar una variable no establecida.
Un guión como
resultará en
Si está utilizando en su
bash
lugar, el error se verá así:fuente
set -u
evita exactamente el tipo de error que el OP está tratando de evitar y (al contrario de todas las otras soluciones) no se limita a un conjunto específico de variables. De hecho, es una precaución útil para casi todos los scripts de shell que fallen de manera segura en lugar de hacer cosas inesperadas cuando una variable no está configurada. Este artículo es una referencia útil sobre el tema.set -u
Creo que podría usarse también, pero no es tan flexible como la expansión de parámetros adecuada (vea mi pregunta actualizada). Y conset -u
tendría que hacer un acceso ficticio a todas las variables de destino si quiero verificar su presencia en un solo lugar.Una solución que es máximamente amigable prueba todos los requisitos y los informa en conjunto, en lugar de fallar en el primero y requerir de ida y vuelta para hacer las cosas bien:
Utilizo una variable de matriz para rastrear qué variables no se han establecido y utilizo el resultado para redactar un mensaje orientado al usuario.
Notas:
${required_vars[@]}
en elfor
ciclo principalmente por costumbre: ¡no recomendaría incluir metacaracteres de shell en sus nombres de variables!${#missing_vars[@]}
, porque eso siempre es un número entero, incluso si eres lo suficientemente perverso como para ignorar el consejo anterior.%q
al imprimir;%s
normalmente sería suficiente>&2
, por lo que no se canaliza a los comandos posterioresfuente
bash
4.2 le permite probar si una variable se establece con el-v
operador; una variable no establecida y una variable establecida en la cadena vacía son dos condiciones diferentes:fuente
-v
toma el nombre de una variable, por lofor var in one two three; [[ -v $var ]] && ...; done
que comprobar si cada uno deone
,two
ythree
se ponen en secuencia.Creo que si quieres decir
not set
, entonces la variable nunca debe inicializarse. Si usa[ -n "${!var}" ]
, entonces la variable vacía comotwo=""
fallará, mientras está configurada . Puedes probar esto:fuente
Una solución concisa (aunque ligeramente hacky), para manejar el caso en el que está bien que el
source
script d establezca las variables en un valor nulo, es inicializar las variables a algún valor especial antes de obtener el script, y luego verificar ese valor después , p.ejfuente
He extendido la respuesta de @ mikeserv .
Esta versión toma una lista de variables para verificar la presencia, imprime el nombre de la variable que falta y activa una llamada al uso () en caso de error.
Ejemplo de salida cuando falta un valor:
Tenga en cuenta que puede cambiar la variable llamada VALOR a un nombre alternativo que se adapte mejor a su salida deseada.
fuente