GNU/Linux >> Tutoriales Linux >  >> Linux

¿La diferencia entre [[ $a ==Z* ]] y [ $a ==Z* ]?

¿Hay alguna diferencia entre estos dos?

[[ $a == z* ]]

y

[ $a == z* ] 

¿Puedo tener un ejemplo donde tendrían diferentes salidas?

Además, ¿cómo funciona el funcionamiento de [[ ]] difiere de [ ] ?

Respuesta aceptada:

La diferencia entre [[ … ]] y [ … ] se cubre principalmente en ¿Por qué la expansión de parámetros con espacios sin comillas funciona dentro de corchetes dobles “[[” pero no dentro de corchetes simples “[“?.
Crucialmente, [[ … ]] es una sintaxis especial, mientras que [ es un nombre divertido para un comando. [[ … ]] tiene reglas de sintaxis especiales para lo que hay dentro, [ … ] no.

Con el añadido de un comodín, así es como [[ $a == z* ]] se evalúa:

  1. Analice el comando:este es el [[ … ]] construcción condicional alrededor de la expresión condicional $a == z* .
  2. Analizar la expresión condicional:este es el == operador binario, con los operandos $a y z* .
  3. Expande el primer operando en el valor de la variable a .
  4. Evaluar el == operador:prueba si el valor de la variable a coincide con el patrón z* .
  5. Evaluar la expresión condicional:su resultado es el resultado del operador condicional.
  6. El comando ahora se evalúa, su estado es 0 si la expresión condicional era verdadera y 1 si era falsa.

Así es como [ $a == z* ] se evalúa:

  1. Analice el comando:este es el [ comando con los argumentos formados al evaluar las palabras $a , == , z* , ] .
  2. Expandir $a en el valor de la variable a .
  3. Realice la división de palabras y la generación de nombres de archivo en los parámetros del comando.
    • Por ejemplo, si el valor de a es la cadena de 6 caracteres foo b* (obtenido por ejemplo, a='foo b*' ) y la lista de archivos en el directorio actual es (bar , baz , qux , zim , zum ), entonces el resultado de la expansión es la siguiente lista de palabras:[ , foo , bar , baz , == , zim , zum , ] .
  4. Ejecute el comando [ con los parámetros obtenidos en el paso anterior.
    • Con los valores de ejemplo anteriores, el [ comando se queja de un error de sintaxis y devuelve el estado 2.

Nota:En [[ $a == z* ]] , en el paso 3, el valor de a no se somete a la división de palabras ni a la generación de nombres de archivo, porque se encuentra en un contexto en el que se espera una sola palabra (el argumento de la izquierda del operador condicional == ). En la mayoría de los casos, si una sola palabra tiene sentido en esa posición, la expansión variable se comporta como si estuviera entre comillas dobles. Sin embargo, hay una excepción a esa regla:en [[ abc == $a ]] , si el valor de a contiene comodines, luego abc se compara con el patrón comodín. Por ejemplo, si el valor de a es a* entonces [[ abc == $a ]] es verdadero (porque el comodín * proveniente de la expansión sin comillas de $a coincide con bc ) mientras que [[ abc == "$a" ]] es falso (porque el carácter ordinario * proveniente de la expansión citada de $a no coincide con bc ). Dentro de [[ … ]] , las comillas dobles no marcan la diferencia, excepto en el lado derecho de los operadores de coincidencia de cadenas (= , == , != y =~ ).

Relacionado:¿Imprimir la línea coincidente y la enésima línea de la línea coincidente?
Linux
  1. ¿La diferencia entre Getty y Agetty?

  2. ¿La diferencia entre ~/.profile y ~/.bash_profile?

  3. ¿La diferencia entre Nss y Pam?

  4. Diferencia entre el montón de Java y el montón de C nativo

  5. ¿Cuál es la diferencia entre fsck y e2fsck?

¿Cuál es la diferencia entre Linux y Unix?

¿La diferencia entre Lubuntu y Lxde?

¿Qué es un Hipervisor? ¿Cuál es la diferencia entre el tipo 1 y 2?

¿Cuál es la diferencia entre curl y Wget?

¿Cuál es la diferencia entre strtok_r y strtok_s en C?

¿Cuál es la diferencia entre unlink y rm?