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

Respuestas:
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" fifuente
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.Para comprobar la cadena vacía en shell
if [ "$str" == "" ];then echo NULL fiO
if [ ! "$str" ];then echo NULL fifuente
=. El==es un truco no portátil inventado por autores de shell para arruinar las mentes de los programadores jóvenes.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!"fuente
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í .
fuente
[[ -n "$1" ]]mismo que[[ ! -z "$1" "]]?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' fiConsulte Expansión de parámetros de shell y coincidencia de patrones en el Manual de Bash.
fuente
[ $(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
fuente