1 votos

¿Cómo prueba bash 'falso'?

$ false
$ echo $?
1

$ if [[ false ]]; then echo 'do it'; fi
do it

$ test false && echo 'do it'
do it

$ COND=false
$ echo $COND
false
$ if [[ $COND -ne 0 ]]; then echo 'do it'; fi
$ if [[ $COND -ne true ]]; then echo 'do it'; fi

Esto es una tontería de la OMI, lo que me estoy perdiendo aquí?

-- Actualización

Así que la siguiente es cómo va:

$ COND=false
$ if ! $COND; then echo 'do it'; fi
do it
$ if $COND; then echo 'do it'; fi

Pero quiero combinar $COND con otras expresiones condicionales en uno de los más grandes de la prueba de expresión (o [[ {expr} && {expr} ]]). Así que cuando $COND es falso que no funciona dentro de una [[ {expr} ]] de forma intuitiva. Parece que el [[ {expr} ]] es un poco engañosa, cuando lo que necesito es más como:

$ COND=false
$ if ! $COND && test -d ${HOME}/bin ; then echo 'do it'; fi
do it

2voto

rwc9u Puntos 532

Shell sintaxis es altamente dependiente del contexto. Es decir, lo que una cosa en particular (como true o false) significa que depende en gran medida de donde se produce. En sus ejemplos, false tiene tres significados completamente diferentes: un comando, una cadena de valor, y un (inexistente) nombre de la variable que contiene un valor entero. Déjame correr a través de los ejemplos:

  • false como un comando:

    false; echo $?    # prints "1"
    if false; then echo "yep"; else echo "nope"; fi    # prints "nope"
    

    Hay un comando llamado "falso" (generalmente /usr/bin/false, o un bash builtin que hace la misma cosa) que en realidad no hacer nada más que salir con un estado de error. Como un estado de salida cero, indica que el éxito (que es una especie de verdad) y un valor distinto de cero indica que no (que es una especie de falso). Esto es el opuesto de la más habitual cero=false, distinto de cero=true convención, pero para salir de los estados tiene más sentido.

  • false no interpretada como un valor de cadena:

    if [[ false ]]; then echo "yep"; else echo "nope"; fi     # prints "yep"
    if [[ true ]]; then echo "yep"; else echo "nope"; fi      # prints "yep"
    if [[ wibble ]]; then echo "yep"; else echo "nope"; fi    # prints "yep"
    if [[ "this is a string" ]]; then echo "yep"; else echo "nope"; fi    # prints "yep"
    [[ false ]]; echo $?    # prints "0" (=success)
    [ false ]; echo $?      # prints "0" (=success)
    test false; echo $?     # prints "0" (=success)
    

    En todos estos casos, el comando test o su sinónimo, [ o el bash expresión condicional [[ ]] no obtener una expresión en una sola cadena, por lo que realizar una prueba muy simple: es un valor distinto de cero-la longitud de la cuerda? "verdadero", "falso", "wibble", etc, son todos distintos de cero de longitud, por lo que el comando/expresión es la verdad-como, de ahí el éxito. Comparar con:

    [[ "" ]]; echo $?    # prints "1" (=failure), because the string is zero-length
    [[ ]]; echo $?       # prints "1" (=failure), because there isn't even a string
    [ ]; echo $?         # same
    

    Tenga en cuenta que test y [ son normales comandos, y "false" (y "wibble", etc) es sólo un argumento. [[ ]] es un poco de sintaxis de bash que puede ser utilizado en lugar de un comando. Sus argumentos/contenidos son interpretados de manera diferente a partir de los nombres de los comandos de sí mismos.

  • false como un posible nombre de la variable que puede contener un número entero:

    if [[ false -eq true ]]; then echo "equal"; else echo "nope"; fi     # prints "equal"
    

    Este es un poco más raro, y depende de los detalles de cómo bash [[ ]] pruebas para la igualdad numérica. Tenga en cuenta que en [[ ]] (e [ ] y test expresiones), -eq pruebas numéricas igualdad, y = pruebas para la cadena de igualdad. Así, por ejemplo, [[ 01 -eq 1 ]] (porque el 1 y 01 son numéricamente iguales) es cierto, pero [[ 01 = 1 ]] es falsa (porque no son de la misma cadena). En el caso de [[ false -eq true ]], "verdadero" y "falso" no son valores enteros, por lo que bash intenta convertir a enteros tratándolos como los nombres de las variables (y la esperanza de que las variables contienen valores enteros). De hecho, ni se define como una variable, por lo que evaluar a la cadena vacía, que puede ser interpretado como el entero 0. Observar:

    if [[ false -eq true ]]; then echo "equal"; else echo "nope"; fi     # prints "equal"
    if [[ false -eq 0 ]]; then echo "equal"; else echo "nope"; fi        # prints "equal"
    false=5
    if [[ false -eq true ]]; then echo "equal"; else echo "nope"; fi     # now prints "nope"
    

    Tenga en cuenta que la definición de false como una variable no tiene ningún efecto sobre sus otros usos; cuando se utiliza como un comando que aún vamos a salir con el estado 1, y cuando se utiliza como una cadena que no deja de ser sólo "falso" (no "5").

1voto

Xen2050 Puntos 2860

No estás ejecutando el false comando, pero el uso de [[ (similar a test y [ builtin de comandos) para evaluar la expresión "falsa", y sin dar nada a evaluar es hacer esto:

cadena
-n cadena
Verdadero si la longitud de cadena es distinto de cero.

Ver las EXPRESIONES CONDICIONALES sección de man bash para más información.

if no ejecutar la orden dada, a continuación, examina el estado de salida.

[Se hace referencia cortesía de la respuesta de TAN]

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: