uso son que ortograficos ortografia oraciones los ingles indica imagen ejercicios ejemplos corchetes corchete bash if-statement syntax

bash - ortograficos - que son corchetes ejemplos



¿Los corchetes dobles[[]] son preferibles a los corchetes simples[] en Bash? (7)

En pocas palabras, [[es mejor porque no tiene otro proceso. Ningún soporte o un soporte simple es más lento que un soporte doble porque forza otro proceso.

Un compañero de trabajo afirmó recientemente en una revisión de código que la construcción [[ ]] debe preferirse a [ ] en construcciones como

if [ "`id -nu`" = "$someuser" ] ; then echo "I love you madly, $someuser" fi

Él no podía proporcionar una razón de ser. Hay uno


Una situación típica en la que no puede usar [[está en un script de autotools configure.ac, los corchetes tienen un significado especial y diferente, por lo que tendrá que usar test lugar de [o [[- Tenga en cuenta que prueba y [son los mismos programa.


[[]] los corchetes dobles no se admiten en ciertas versiones de SunOS y no se admiten las declaraciones de funciones internas de: GNU bash, versión 2.02.0 (1) -release (sparc-sun-solaris2.6)


¿ Desde qué comparador, prueba, corchete o paréntesis es el más rápido? ( http://bashcurescancer.com )

El paréntesis doble es un "comando compuesto" en el que, como prueba y el corchete simple, están integrados en el shell (y en realidad son el mismo comando). Así, el corchete simple y el corchete doble ejecutan un código diferente.

La prueba y el soporte único son los más portátiles, ya que existen como comandos separados y externos. Sin embargo, si utiliza alguna versión remotamente moderna de BASH, se admite el soporte doble.



[[ tiene menos sorpresas y generalmente es más seguro de usar. Pero no es portátil: POSIX no especifica lo que hace y solo algunos shells lo admiten (además de bash, escuché que ksh también lo soporta). Por ejemplo, puedes hacer

[[ -e $b ]]

para comprobar si existe un archivo. Pero con [ , tienes que citar $b , porque divide el argumento y expande cosas como "a*" (donde [[ se lo toma literalmente). Eso también tiene que ver con cómo [ puede ser un programa externo y recibe su argumento normalmente como cualquier otro programa (aunque también puede ser un componente incorporado, pero aún no tiene este manejo especial).

[[ también tiene algunas otras características interesantes, como la concordancia de expresiones regulares con =~ junto con operadores como se conocen en lenguajes tipo C ''. Aquí hay una buena página al respecto: ¿Cuál es la diferencia entre la prueba, [ y [[ ? y pruebas de golpe


Diferencias de comportamiento

Primero, analicemos las diferencias de comportamiento entre ambos. Probado en Bash 4.3.11.

  • POSIX vs extensión Bash:

    • [ es POSIX
    • [[ es una extensión de Bash
  • Comando regular vs magia

    • [ es solo un comando regular con un nombre extraño

      ] es solo un argumento de [ que evita que se usen otros argumentos.

      Ubuntu 16.04 en realidad tiene un ejecutable para él en /usr/bin/[ proporcionado por coreutils, pero la versión integrada de bash tiene prioridad.

      Nada se altera en la forma en que Bash analiza el comando.

      En particular, < es redirección, && y || concatenar múltiples comandos, ( ) genera subshells a menos que se escape por / , y la expansión de palabras ocurre como de costumbre.

    • [[ X ]] es una construcción simple que hace que X sea ​​analizado mágicamente. < , && , || y () se tratan especialmente, y las reglas de división de palabras son diferentes.

      También hay otras diferencias como = y =~ .

    En Bashese: [ es un comando incorporado, y [[ es una palabra clave: https://askubuntu.com/questions/445749/whats-the-difference-between-shell-builtin-and-shell-keyword

  • <

    • [[ a < b ]] : comparación lexicográfica
    • [ a /< b ] : Igual que arriba. / required o bien hace redirección como para cualquier otro comando. Extensión de Bash.
    • No pude encontrar una alternativa POSIX a esto, vea: ¿Cómo probar cadenas por menos o igual?
  • && y ||

    • [[ a = a && b = b ]] : verdadero, lógico y
    • [ a = a && b = b ] : error de sintaxis, && analizado como un separador de comando AND cmd1 && cmd2
    • [ a = a -ab = b ] : equivalente, pero desaprobado por POSIX
    • [ a = a ] && [ b = b ] : recomendación POSIX
  • (

    • [[ (a = a || a = b) && a = b ]] : falso
    • [ ( a = a ) ] : error de sintaxis, () se interpreta como una subshell
    • [ /( a = a -oa = b /) -aa = b ] : equivalente, pero () está en desuso por POSIX
    • ([ a = a ] || [ a = b ]) && [ a = b ] recomendación POSIX
  • división de palabras

    • x=''a b''; [[ $x = ''ab'' ]] x=''a b''; [[ $x = ''ab'' ]] : verdadero, no se necesitan comillas
    • x=''a b''; [ $x = ''ab'' ] x=''a b''; [ $x = ''ab'' ] : error de sintaxis, se expande a [ ab = ''ab'' ]
    • x=''a b''; [ "$x" = ''ab'' ] x=''a b''; [ "$x" = ''ab'' ] : equivalente
  • =

    • [[ ab = a? ]] [[ ab = a? ]] : verdadero, porque hace un patrón de coincidencia ( * ? [ son mágicos). No se expande a los archivos en el directorio actual.
    • [ ab = a? ] [ ab = a? ] : a? glob se expande Por lo tanto, puede ser verdadero o falso según los archivos en el directorio actual.
    • [ ab = a/? ] [ ab = a/? ] : falso, no expansión global
    • = y == son iguales en ambos [ y [[ , pero == es una extensión de Bash.
    • printf ''ab'' | grep -Eq ''a.'' : POSIX ERE equivalente
    • [[ ab =~ ''ab?'' ]] [[ ab =~ ''ab?'' ]] : falso, pierde magia con ''''
    • [[ ab? =~ ''ab?'' ]] [[ ab? =~ ''ab?'' ]] : verdadero
  • =~

    • [[ ab =~ ab? ]] [[ ab =~ ab? ]] : verdadero, POSIX coincidencia de expresión regular extendida ,? no se expande glob
    • [ a =~ a ] : error de sintaxis
    • printf ''ab'' | grep -Eq ''ab?'' : POSIX equivalente

Recomendación

Prefiero usar siempre [] .

Hay equivalentes de POSIX para cada [[ ]] construcción que he visto.

Si usa [[ ]] usted:

  • perder portabilidad
  • obligar al lector a aprender las complejidades de otra extensión de bash. [ es solo un comando regular con un nombre extraño, no hay semántica especial involucrada.