Necesito verificar la existencia de una variable en una if
declaració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.
$somevar
en 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
,$-
,$#
...test
o[
; No está disponible en/usr/bin/test
. Compararman test
conhelp 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
$-
,$#
,$1
las 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
,for
u otros).Para shells que tienen un comando
typeset
odeclare
, 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
yash
yzsh
que no se reportarían como variables de matriz establecidas a menos que se haya establecido el elemento del índice 0.Para
bash
(pero noksh93
nizsh
), 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
ksh93
ybash
, para variables de tipo nameref , eso solo devuelve verdadero si la variable referenciada por nameref se considera establecida .Para
ksh
,zsh
ybash
, un enfoque potencialmente mejor podría ser:Para
ksh93
,zsh
ybash
4.4 o superior, también hay:Que informará las variables que se han establecido o declarado.
fuente
declare -p
/typeset -p
trabajabash
ahora también.bash -c 'typeset -i a; typeset -p a'
y compara conksh93
ozsh
.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
$somevar
para manejarIFS=x
. O eso o citarx
.if [ -z "${somevar+x}" ]
? ¿Todavía se requeriría la cita dentro[[
y]]
?[ test
rutinas 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 -u
está vigente y la versión Bash es anterior a la 4.2.POSIXY:
o puede dejar que su shell le muestre el mensaje:
fuente
trap
solo 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
sh
compatible, 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
printf
fallar en función de una sustitución ...... que imprime
$var does not exist!
en stderr y devuelve un valor distinto de 0 cuando no$var
está configurado, pero imprime$var does exist!
en stdout y devuelve 0 cuando$var
está 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
$IFS
contiene 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
.most
significaIn the greatest number of instances
, no todos. ... ... Entonces, sí, en una condición oscurawhen $IFS contains f, a, l, s or e
y para un caparazón oscurosome old versions of zsh
esto 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
if
comando para verificar la existencia de variables declaradas en bash, sin embargo, la-v
opción existe en bash más reciente, pero no es portátil y no puede usarlo enbash
versiones 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
MYTEST
variable, 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
-v
opción):declare
comando.set
comando.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=()
$1
contiene 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