world script hello example ejemplos basics linux bash ubuntu centos boolean-logic

linux - hello - Bash Script está volviendo verdadero para ambas pruebas de cuerda opuestas



linux sh script example (4)

Antes de ejecutar el script, ingresé

# export CPIC_MAX_CONV=500

El siguiente es el archivo test1.script

#!/bin/bash function cpic () { var="`export | grep -i "CPIC_MAX_CONV" | awk ''/CPIC_MAX_CONV/ { print $NF } ''`" [[ $var=="" ]] && (echo "Empty String <<") [[ $var!="" ]] && (echo "$CPIC_MAX_CONV") echo "$var" ; } cpic

El resultado es:

# test1.script ---- Me running the file Empty String << 500 CPIC_MAX_CONV="500"

No importa lo que use "" o "" o [o [[el resultado es el mismo. La variable CPIC_MAX_CONV se encuentra mediante el script anterior.

Estoy ejecutando esto en Linux / CentOS 6.3.

La idea es simple: encontrar si CPIC_MAX_CONV se define en el entorno y devolver el valor de la misma. Si hay un espacio vacío, entonces, por supuesto, la variable no está presente en el sistema.


¿Por qué siempre te haces cierto? Primero juguemos un poco en tu terminal:

$ [[ hello ]] && echo "True"

¿Cuál crees que es la salida? (¡pruébalo!) ¿Y con lo siguiente?

$ [[ "" ]] && echo "True"

(¡intentalo!).

De acuerdo, parece que una cadena no vacía es equivalente a la expresión verdadera, y una cadena vacía (o una variable no configurada) es equivalente a la expresión falsa.

Lo que hiciste fue lo siguiente:

[[ $var=="" ]]

y

[[ $var!="" ]]

así que le diste una cadena no vacía, ¡lo cual es cierto!

Para realizar la prueba, realmente necesitas espacios entre los tokens:

[[ $var == "" ]]

en lugar. Ahora, su prueba estaría mejor escrita como:

if [[ -z "$var" ]]; then echo "Empty String <<" else echo "$CPIC_MAX_CONV" fi

(sin las subcapas, y con solo una prueba).

Hay más para decir sobre su estilo de scripting. Sin ofender, diría que es realmente malo:

  • ¡No use los apoyos! Use el constructo $(...) lugar. Por lo tanto:

    var="$(export | grep -i "CPIC_MAX_CONV" | awk ''/CPIC_MAX_CONV/ { print $NF } '')"

  • No use la function blah para definir una función. Su función debería haberse definido como:

    cpic () { local var="$(export | grep -i "CPIC_MAX_CONV" | awk ''/CPIC_MAX_CONV/ { print $NF } '')" if [[ -z "$var" ]]; then echo "Empty String <<" else echo "$CPIC_MAX_CONV" fi }

Ah, usé la palabra clave local , porque supongo que no vas a usar la var variable fuera de la función cpic .

Ahora, ¿cuál es el propósito de la función cpic y, en particular, de las cosas en las que está definiendo la variable var ? Sería difícil de describir (ya que hay tantos casos que no has pensado). (Por cierto, tu grep parece realmente inútil aquí). Aquí hay algunos casos que pasaste por alto:

  • Una variable exportada se llama somethingfunnyCPIC_MAX_CONVsomethingevenfunnier
  • Una variable exportada contiene la cadena CPIC_MAX_CONV algún lugar, por ejemplo,

    export a_cool_variable="I want to screw up Randhawa''s script and just for that, let''s write CPIC_MAX_CONV somewhere here"

Ok, no quiero describir exactamente lo que su línea está haciendo, pero supongo que su propósito es saber si la variable CPIC_MAX_CONV está configurada y marcada para exportar, ¿verdad? En ese caso, sería mejor con solo esto:

cpic () { if declare -x | grep -q ''^declare -x CPIC_MAX_CONV=''; then echo "Empty String <<" else echo "$CPIC_MAX_CONV" fi }

Será más eficiente y mucho más robusto.

Oh, ahora estoy leyendo el final de tu publicación. Si quiere saber si la variable CPIC_MAX_CONV está configurada (a algún valor no vacío, parece que no le importa si está marcado para exportar o no, corríjalo si me equivoco), es incluso más simple (y lo hará). ser mucho más eficiente):

cpic () { if [[ "$CPIC_MAX_CONV" ]]; then echo "Empty String <<" else echo "$CPIC_MAX_CONV" fi }

¡también lo hará!


Necesitas espacios en tus condiciones.

#!/bin/bash function cpic () { var="`export | grep -i "CPIC_MAX_CONV" | awk ''/CPIC_MAX_CONV/ { print $NF } ''`" [[ $var == "" ]] && (echo "Empty String <<") [[ $var != "" ]] && (echo "$CPIC_MAX_CONV") echo "$var" ; } cpic


Prueba esto:

#!/bin/bash function cpic () { var="`export | grep -i "CPIC_MAX_CONV"`" [ "$var" = "" ] && (echo "Empty String <<") [ "$var" != "" ] && echo "$CPIC_MAX_CONV" } cpic


¿Realmente le importa si CPIC_MAX_CONV es una variable de entorno frente a solo ''es una variable que podría ser una variable de entorno''? Lo más probable es que no lo haga, sobre todo porque si se trata de una variable pero no de una variable de entorno, cualquier secuencia de comandos que ejecute no verá el valor (pero si insiste en usar alias y funciones, entonces podría ser importante, pero aún así probablemente no lo hará).

Parece, entonces, que está tratando de comprobar si CPIC_MAX_CONV está configurado en un valor no vacío. Hay varias formas fáciles de hacerlo, y luego está la manera en que lo has intentado.

: ${CPIC_MAX_CONV:=500}

Esto garantiza que CPIC_MAX_CONV esté configurado en un valor no vacío; usa 500 si previamente no había un valor establecido. El comando : (dos puntos) evalúa sus argumentos e informa el éxito. Puede organizar la exportación de la variable una vez creada, si desea export CPIC_MAX_CONV .

Si debe tener la variable establecida (no hay un valor predeterminado adecuado), entonces usa:

: ${CPIC_MAX_CONV:?}

o

: ${CPIC_MAX_CONV:?''The CPIC_MAX_CONV variable is not set but must be set''}

La diferencia es que puede usar el mensaje predeterminado (''CPIC_MAX_CONV: parámetro nulo o no establecido'') o especificar el suyo.

Si solo va a usar el valor una vez, puede hacer una sustitución "sobre la marcha" en un comando con:

cpic_command -c ${CPIC_MAX_CONV:-500} ...

Esto no crea la variable si no existe, a diferencia de la notación := que sí lo hace.

En todas estas anotaciones, he estado usando dos puntos como parte de la operación. Eso impone ''nulo o no establecido''; puede omitir los dos puntos, pero eso permite que una cadena vacía sea un valor válido, que probablemente no sea lo que desea. Tenga en cuenta que una cadena que consta de un espacio en blanco es ''no está vacía''; si necesita validar que tiene una cadena no vacía, debe trabajar un poco más.

No estoy diseccionando tu mal uso del [[ comando; gniourf_gniourf ha proporcionado una excelente deconstrucción de eso, pero pasó por alto las anotaciones más simples disponibles para hacer lo que parece ser el trabajo.