Estoy tratando de ejecutar la siguiente secuencia de comandos de shell que se supone que para comprobar si una cadena es ni espacio ni vacío. Sin embargo, estoy consiguiendo el mismo resultado para todos los 3 mencionados cadenas. He intentado usar el «[[» sintaxis así, 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

Estoy obteniendo el siguiente resultado:

# ./checkCond.sh 
Str is not null or space
Str2 is not null or space

6 Comentarios

  1. 104

    Necesita un espacio a cada lado de la !=. Cambiar su código para:

    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
    • Muchas gracias, funciona. Pero me pregunto por qué la asignación de no uso de un espacio, mientras que una comparación.
    • ^^Es la sintaxis. La primera palabra en la línea de comando es el comando & las posteriores son argumentos. var=value [command [args]] es la sintaxis, en la que una variable se le asigna el valor. para la comparación, [ (/usr/bin/[) es el command & requiere var1, != & var2 a ser independiente 3 argumentos. var1!=var2 es un argumento único.
    • Muchas gracias por el detalle, lo tengo ahora =)
  2. 55

    Para la comprobación de la cadena vacía en shell

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

    O

    if [ ! "$str" ];then
       echo NULL
    fi
    • La concha de la cadena de operador de igualdad es =. El == es un no-portátil hack inventado por shell autores a desordenar las mentes de jóvenes programadores.
  3. 16

    En caso de que usted necesita para comprobar en contra de cualquier cantidad de espacios, no sólo de espacio, usted puede hacer esto:

    Para quitar la cadena de la extra de espacio en blanco (también condences los espacios en blanco en el medio de un espacio):

    trimmed=`echo -- $original`

    La -- asegura que si $original contiene interruptores entiende por echo, que todavía se considera como normal argumentos que se hizo eco. También es importante no poner "" alrededor de $original, o los espacios no se eliminan.

    Después de que usted puede comprobar si $trimmed está vacía.

    [ -z "$trimmed" ] && echo "empty!"
    • En bourne shell que terminan con «- como» el valor de tapizados.
  4. 8

    Otra prueba rápida para una cadena de tener algo en ella, pero en el espacio.

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

    «-n» significa que no es cadena de longitud cero.

    A continuación, las dos primeras barras de la media de partido todos de las siguientes, en nuestro caso el espacio(s). A continuación, la tercera barra es seguido con la sustitución (vacío) de la cadena y se cierra con «}». Nota la diferencia de la habitual sintaxis de expresión regular.

    Usted puede leer más acerca de la manipulación de cadenas en la shell de bash scripting aquí.

    • no [[ -n "$1" ]] la misma como [[ ! -z "$1" "]]?
    • tienes razón, el uso de -n sería un poco más corto. Acabo de actualizar la respuesta en consecuencia.
  5. 6

    Para comprobar si una cadena está vacía o contiene sólo el espacio en blanco puede utilizar:

    shopt -s extglob  # more powerful pattern matching
    
    if [ -n "${str##+([[:space:]])}" ]; then
        echo '$str is not null or space'
    fi

    Ver Shell Parámetro De Expansión y La Coincidencia De Patrón en el Manual de Bash.

    • Podrías explicar un poco para los propósitos de aprendizaje? Esto parece un galimatías ^^; ¿Es esto como grep o algo?
    • M: Comprobar los enlaces a los documentos que he proporcionado en el post.
  6. 1
    [ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"

    Pelar todos los saltos de línea y espacios de la cadena hará que una en blanco para ser reducido a la nada que puede ser probado y se ha actuado sobre

Dejar respuesta

Please enter your comment!
Please enter your name here