Necesito verificar la existencia de una variable en una ifdeclaración. Algo en el sentido de:
if [ -v $somevar ]
then
echo "Variable somevar exists!"
else
echo "Variable somevar does not exist!"
Y la pregunta más cercana a esto fue esta , que en realidad no responde a mi pregunta.

$somevaren un valor / cadena si la variable no existe:${somevar:=42}.[ -n "$var" ]o[ ! -z "$var" ]). Creo que las comprobaciones de existencia / inexistencia son demasiado sutiles, y prefiero que mi código sea grueso y simple.[ -n "$var" ]? Relacionado: stackoverflow.com/questions/3601515/…Respuestas:
En bash moderno (versión 4.2 y superior):
De
help test:fuente
[ -v name_of_var ].$1,$-,$#...testo[; No está disponible en/usr/bin/test. Compararman testconhelp test.Depende de lo que quieres decir con existe .
No una variable que ha sido declarado pero no asignado existe ?
¿Tiene una matriz (o hash) variable que se ha asignado una lista vacía existen ?
No una variable nameref que apunta a una variable que actualmente no se asigna existe ?
¿Se considera
$-,$#,$1las variables? (POSIX no).En conchas tipo Bourne, la forma canónica es:
Eso funciona para variables escalares y otros parámetros para saber si una variable se le ha asignado un valor (vacía o no, de forma automática, desde el medio ambiente, Traspaso,
read,foru otros).Para shells que tienen un comando
typesetodeclare, eso no informaría como conjunto las variables que se han declarado pero no se han asignado, excepto enzsh.Para shells que admiten matrices, excepto
yashyzshque no se reportarían como variables de matriz establecidas a menos que se haya establecido el elemento del índice 0.Para
bash(pero noksh93nizsh), para las variables de tipo de matriz asociativa , eso no se informaría como conjunto a menos que se haya establecido su elemento de clave "0".Para
ksh93ybash, para variables de tipo nameref , eso solo devuelve verdadero si la variable referenciada por nameref se considera establecida .Para
ksh,zshybash, un enfoque potencialmente mejor podría ser:Para
ksh93,zshybash4.4 o superior, también hay:Que informará las variables que se han establecido o declarado.
fuente
declare -p/typeset -ptrabajabashahora también.bash -c 'typeset -i a; typeset -p a'y compara conksh93ozsh.Como se menciona en la respuesta sobre SO , aquí hay una forma de verificar:
donde $ {somevar + x} es una expansión de parámetro que se evalúa como nulo si var no está establecida y sustituye la cadena "x" de lo contrario.
El uso
-n, como lo sugiere la otra respuesta, solo verificará si la variable contiene una cadena vacía. No verificará su existencia.fuente
$somevarpara manejarIFS=x. O eso o citarx.if [ -z "${somevar+x}" ]? ¿Todavía se requeriría la cita dentro[[y]]?[ testrutinas aceptan los parámetros de la línea de comandos, por lo que las expansiones e interpretaciones habituales, tal como se ordenan de la manera habitual, se deben confiar para que, en la invocación de la prueba, se aplique lo que usted debe hacer que sea leído por cualquier línea de comandos del programa. prueba {! + "!"}set -uestá vigente y la versión Bash es anterior a la 4.2.POSIXY:
o puede dejar que su shell le muestre el mensaje:
fuente
trapsolo puede funcionar en EXIT. Eso es todo lo que digo: simplemente no se aplica como un pase / falla muy bien. Y tampoco soy yo quien habla, he hecho exactamente esto antes y me tomó un pequeño chat de comentarios como este para convencerme. Entonces, pensé que lo pagaría.fuente
shcompatible, que es justo lo que necesito.... no imprimirá nada cuando no lo haga. O...
... te lo diré de cualquier manera.
puede usar el valor de retorno de una prueba para expandirse dinámicamente a la cadena de formato apropiada para su condición:
También puede
printffallar en función de una sustitución ...... que imprime
$var does not exist!en stderr y devuelve un valor distinto de 0 cuando no$varestá configurado, pero imprime$var does exist!en stdout y devuelve 0 cuando$varestá configurado.fuente
Esta línea simple funciona (y funciona en la mayoría de los shells POSIX):
O, escrito en una forma más larga:
La expansión es:
La
${var+"false"}expansión se expande a "nulo" o "falso".Luego, se ejecuta "nada" o "falso", y se establece el código de salida.
No es necesario llamar al comando
test([o[[) ya que el valor de salida lo establece la (ejecución de) la expansión misma.fuente
$IFScontiene f, a, l, soe. Al igual que para otras respuestas, existe el caso de matrices, hash u otros tipos de variables que uno puede mencionar.most POSIX shells.mostsignificaIn the greatest number of instances, no todos. ... ... Entonces, sí, en una condición oscurawhen $IFS contains f, a, l, s or ey para un caparazón oscurosome old versions of zshesto falla: ¡Qué sorpresa !. Debo suponer que ese error se resolvió hace mucho tiempo. ... ... ¿Está proponiendo que debemos escribir el código para las conchas rotas hace mucho tiempo?La forma pura de la cáscara:
Script de prueba:
Resultados:
fuente
Con bash 4.4.19, lo siguiente funcionó para mí. Aquí hay un ejemplo completo
fuente
No puede usar el
ifcomando para verificar la existencia de variables declaradas en bash, sin embargo, la-vopción existe en bash más reciente, pero no es portátil y no puede usarlo enbashversiones anteriores . Porque cuando estás usando una variable si no existe, nacerá al mismo tiempo.Por ejemplo, ¡imagine que no utilicé o asigné un valor a la
MYTESTvariable, pero cuando utiliza el comando echo no muestra nada! ¡O si lo está utilizandoif [ -z $MYTEST ], devuelve el valor cero! ¡No devolvió otro estado de salida, lo que le dice que esta variable no existe!Ahora tiene dos soluciones (sin
-vopción):declarecomando.setcomando.Por ejemplo:
¡Pero desafortunadamente estos comandos también le muestran funciones cargadas en la memoria! Puede usar el
declare -p | grep -q MYTEST ; echo $?comando para obtener un resultado más limpio.fuente
Función para verificar si la variable se declara / desarma
incluido vacío
$array=()Además de la respuesta de @ Gilles
- que no encontré una forma de encapsularlo dentro de una función - Me gustaría agregar una versión simple, que se basa en parte en la respuesta de Richard Hansen , pero también aborda la trampa que ocurre con un vacío :
array=()$1contiene el nombre de un vacío$array=(), la llamada a declarar se aseguraría de obtener el resultado correctoCon el siguiente código se pueden probar las funciones:
El guión debería volver
fuente
función bash que funciona para los tipos escalares y de matriz :
definición
invocación
fuente