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" fi
fuente
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 fi
O
if [ ! "$str" ];then echo NULL fi
fuente
=
. 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$original
contiene 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
$trimmed
está 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' fi
Consulte 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