los corchetes dobles son inútiles aquí. puede ser simple [-z "$ var"] o incluso más fácil si prueba -z "var" .. de todos modos +1 :)
Luca Borrione
2
los corchetes dobles no son inútiles, si no lo incluyo, no sé ./test.ksh[8]: test: argument expectedcuál es la razón, pero el corchete simple no funcionó, pero el doble lo tenía.
gahlot.jaggs
8
@LucaBorrione Creo que te refieres if test -z "$var", ¿verdad?
neu242
1
Solo un comentario agregado para una situación específica no mencionada directamente en la pregunta: si la variable no está configurada y la set -uopción ha sido activada, esta prueba fallará unbound variable. En este caso, es posible que prefiera la solución de @ alexli.
Anol
3
@LucaBorrione Como una nota al margen: "[[" puede verse como "nunca inútil"; ya que usar "[[" tiene algunas ventajas sobre "[" (vea stackoverflow.com/questions/669452/… por ejemplo)
La respuesta más directa es -z:[[ -z "$an_unset_or_empty_var" ]] && echo empty
glenn jackman
44
@glenn jackman: buen comentario; Es cierto que -zestá más cerca de lo que se le preguntó. Jay ha puesto esto en su respuesta, así que me abstendré de actualizar la mía y dejaré esto como está.
ChristopheD
48
Yo tambien he visto
if["x$variable"="x"];then...
que obviamente es muy robusto e independiente de la carcasa.
Me parece extraño ¿Podría por favor explicar esta solución? Gracias.
guettli
2
@guettli: si $variableestá vacío, entonces la cadena a la izquierda del operador de comparación se vuelve única x, que es igual a la cadena a la derecha del operador. [ x = x ]es "verdadero", por lo que en la práctica esto prueba si $variableestá vacío o no. Como una adición (3½ años después del hecho :-)) Nunca usaría esto yo mismo, ya que -zhace lo que probablemente quiero de una manera más clara, pero quería agregar esta respuesta ya que este método se ve con frecuencia "en la naturaleza"; quizás escrito de esta manera a propósito por personas que han tenido experiencias diferentes a las mías.
Daniel Andersson
30
if[ ${foo:+1}]then
echo "yes"fi
imprime yessi la variable está configurada. ${foo:+1}devolverá 1 cuando se establezca la variable; de lo contrario, devolverá una cadena vacía.
Si bien no se menciona en la pregunta, una ventaja importante de esta respuesta es que funciona incluso cuando la variable no está definida y la set -uopción ( nounset) está activada. Casi todas las otras respuestas a esta pregunta fallarán unbound variableen este caso.
Anol
Esta :+notación también es útil para situaciones en las que tiene parámetros opcionales de línea de comandos que ha especificado con variables opcionales. myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
Sólo para hacer una distinción entre los dos estados, es decir, utilizando ! [ -z "$MyVar" ]significaría que la variable podría tener algo en ella. Pero idealmente uno lo usaría else.
3kstc
6
La pregunta pregunta cómo verificar si una variable es una cadena vacía y las mejores respuestas ya están dadas para eso.
Pero llegué aquí después de un período de programación en PHP, y en realidad estaba buscando una verificación como la función vacía en PHP trabajando en un shell Bash.
Después de leer las respuestas, me di cuenta de que no estaba pensando correctamente en Bash, pero de todos modos en ese momento una función como vacío en PHP habría sido muy útil en mi código de Bash.
Como creo que esto puede sucederle a otros, decidí convertir la función vacía de PHP en Bash.
una variable se considera vacía si no existe o si su valor es uno de los siguientes:
"" (una cadena vacía)
0 (0 como un entero)
0.0 (0 como flotante)
"0" (0 como una cadena)
una matriz vacía
una variable declarada, pero sin un valor
Por supuesto, los casos nulo y falso no se pueden convertir en bash, por lo que se omiten.
function empty
{local var="$1"# Return true if:# 1. var is a null string ("" as empty string)# 2. a non set variable is passed# 3. a declared variable or array but without a value is passed# 4. an empty array is passedif test -z "$var"then[[ $( echo "1")]]return# Return true if var is zero (0 as an integer or "0" as a string)elif["$var"==02>/dev/null ]then[[ $( echo "1")]]return# Return true if var is 0.0 (0 as a float)elif["$var"==0.02>/dev/null ]then[[ $( echo "1")]]returnfi[[ $( echo "")]]}
Ejemplo de uso:
if empty "${var}"then
echo "empty"else
echo "not empty"fi
VAR "" is empty
VAR "0" is empty
VAR "0.0" is empty
VAR "0" is empty
VAR "1" is not empty
VAR "string" is not empty
VAR " " is not empty
Una vez dicho esto, en una lógica Bash, las comprobaciones de cero en esta función pueden causar problemas secundarios, cualquiera que use esta función debería evaluar este riesgo y tal vez decidir cortar esas comprobaciones dejando solo el primero.
Respuestas:
En Bash, al menos el siguiente comando prueba si $ var está vacío :
El comando
man test
es tu amigo.fuente
./test.ksh[8]: test: argument expected
cuál es la razón, pero el corchete simple no funcionó, pero el doble lo tenía.if test -z "$var"
, ¿verdad?set -u
opción ha sido activada, esta prueba fallaráunbound variable
. En este caso, es posible que prefiera la solución de @ alexli.Presumiendo Bash:
fuente
-z
:[[ -z "$an_unset_or_empty_var" ]] && echo empty
-z
está más cerca de lo que se le preguntó. Jay ha puesto esto en su respuesta, así que me abstendré de actualizar la mía y dejaré esto como está.Yo tambien he visto
que obviamente es muy robusto e independiente de la carcasa.
Además, hay una diferencia entre "vacío" y "no establecido". Vea Cómo saber si una cadena no está definida en un script de shell Bash .
fuente
$variable
está vacío, entonces la cadena a la izquierda del operador de comparación se vuelve únicax
, que es igual a la cadena a la derecha del operador.[ x = x ]
es "verdadero", por lo que en la práctica esto prueba si$variable
está vacío o no. Como una adición (3½ años después del hecho :-)) Nunca usaría esto yo mismo, ya que-z
hace lo que probablemente quiero de una manera más clara, pero quería agregar esta respuesta ya que este método se ve con frecuencia "en la naturaleza"; quizás escrito de esta manera a propósito por personas que han tenido experiencias diferentes a las mías.imprime
yes
si la variable está configurada.${foo:+1}
devolverá 1 cuando se establezca la variable; de lo contrario, devolverá una cadena vacía.fuente
set -u
opción (nounset
) está activada. Casi todas las otras respuestas a esta pregunta fallaránunbound variable
en este caso.:+
notación también es útil para situaciones en las que tiene parámetros opcionales de línea de comandos que ha especificado con variables opcionales.myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
fuente
fuente
${variable:-default_value}
[ "$variable" ] || exit
Esto devolverá
true
si una variable no está establecida o establecida en la cadena vacía ("").fuente
elif !
lugar deelse
?! [ -z "$MyVar" ]
significaría que la variable podría tener algo en ella. Pero idealmente uno lo usaríaelse
.La pregunta pregunta cómo verificar si una variable es una cadena vacía y las mejores respuestas ya están dadas para eso.
Pero llegué aquí después de un período de programación en PHP, y en realidad estaba buscando una verificación como la función vacía en PHP trabajando en un shell Bash.
Después de leer las respuestas, me di cuenta de que no estaba pensando correctamente en Bash, pero de todos modos en ese momento una función como vacío en PHP habría sido muy útil en mi código de Bash.
Como creo que esto puede sucederle a otros, decidí convertir la función vacía de PHP en Bash.
De acuerdo con el manual de PHP :
una variable se considera vacía si no existe o si su valor es uno de los siguientes:
Por supuesto, los casos nulo y falso no se pueden convertir en bash, por lo que se omiten.
Ejemplo de uso:
Demostración:
el siguiente fragmento:
salidas:
Una vez dicho esto, en una lógica Bash, las comprobaciones de cero en esta función pueden causar problemas secundarios, cualquiera que use esta función debería evaluar este riesgo y tal vez decidir cortar esas comprobaciones dejando solo el primero.
fuente
Es posible que desee distinguir entre las variables no definidas y las variables establecidas y vacías:
Resultado:
Por cierto, recomiendo usar
set -u
lo que causará un error al leer variables no establecidas, esto puede salvarlo de desastres comoPuede leer sobre esta y otras mejores prácticas para un "modo estricto" aquí .
fuente
Para verificar si la variable v no está establecida
fuente