Compruebe si la cadena no está vacía ni tiene espacio en el script de shell

93

Estoy tratando de ejecutar el siguiente script de shell que se supone que verifica si una cadena no tiene espacio ni está vacía. Sin embargo, obtengo el mismo resultado para las 3 cadenas mencionadas. También he intentado utilizar la sintaxis "[[", pero fue en vano.

Aquí está mi código:

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str"!=" " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2"!=" " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3"!=" " ]; then
        echo "Str3 is not null or space"
fi

Obtengo el siguiente resultado:

# ./checkCond.sh 
Str is not null or space
Str2 is not null or space
Shubhanshu Mishra
fuente
¿Se conocen las cadenas vacías como cadenas nulas en los scripts de shell?
Josiah Yoder

Respuestas:

124

Necesita un espacio a cada lado del !=. Cambie su código a:

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str" != " " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2" != " " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3" != " " ]; then
        echo "Str3 is not null or space"
fi
dogbane
fuente
Muchas gracias, funciona. Pero me pregunto por qué la tarea no usa un espacio mientras que una comparación sí lo hace.
Shubhanshu Mishra
5
^^ Es la sintaxis. La primera palabra en la línea de comando es el comando y las siguientes son argumentos. var=value [command [args]]es la sintaxis, en la que se asigna un valor a una variable. a modo de comparación, [( /usr/bin/[) es el comando y requiere que var1,! = & var2 sean 3 argumentos separados. var1! = var2 es un solo argumento.
anishsane
63

Para comprobar la cadena vacía en shell

if [ "$str" == "" ];then
   echo NULL
fi

O

if [ ! "$str" ];then
   echo NULL
fi
RajeshKashyap
fuente
9
El operador de igualdad de cadenas del shell es =. El ==es un truco no portátil inventado por autores de shell para arruinar las mentes de los programadores jóvenes.
Jens
17

En caso de que necesite verificar cualquier cantidad de espacios en blanco, no solo un espacio individual, puede hacer esto:

Para quitar una cadena de espacio en blanco adicional (también condensa el espacio en blanco en el medio a un espacio):

trimmed=`echo -- $original`

El --asegura que si $originalcontiene conmutadores entendidos por eco, aún se considerarán como argumentos normales para ser repetidos. También es importante no colocar ""alrededor $original, o los espacios no se eliminarán.

Después de eso, puede verificar si $trimmedestá vacío.

[ -z "$trimmed" ] && echo "empty!"
Hyde
fuente
3
En bourne shell termino con "-" como el valor de recortado.
Sridhar Sarnobat
Según esta publicación , echo no interpreta, significa el final de las opciones. En mi shell Bash, obtengo el mismo resultado que Sridhar Sarnobat
Mr.C
9

Otra prueba rápida para que una cuerda tenga algo pero espacio.

if [[ -n "${str// /}" ]]; then
    echo "It is not empty!"
fi

"-n" significa una cadena de longitud distinta de cero.

Entonces, las dos primeras barras significan que coinciden con todo lo siguiente, en nuestro caso, espacio (s). Luego, la tercera barra se sigue con la cadena de reemplazo (vacía) y se cierra con "}". Tenga en cuenta la diferencia con la sintaxis habitual de las expresiones regulares.

Puede leer más sobre la manipulación de cadenas en scripts de shell bash aquí .

elomage
fuente
no es lo [[ -n "$1" ]]mismo que [[ ! -z "$1" "]]?
Alexander Mills
@AlexanderMills tienes razón, usar -n lo acortaría un poco. Acabo de actualizar la respuesta en consecuencia.
elomage
6

Para verificar si una cadena está vacía o contiene solo espacios en blanco, puede usar:

shopt -s extglob  # more powerful pattern matching

if [ -n "${str##+([[:space:]])}" ]; then
    echo '$str is not null or space'
fi

Consulte Expansión de parámetros de shell y coincidencia de patrones en el Manual de Bash.

Eugene Yarmash
fuente
1
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"

Eliminar todas las líneas nuevas y los espacios de la cadena hará que uno en blanco se reduzca a nada que se pueda probar y actuar

Duro Shandilya
fuente