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 más funciones. Le sugiero que eche un vistazo a Advanced Bash Scripting Guide para obtener más información, específicamente la sección del comando de prueba extendida en el Capítulo 7. Pruebas .
Incidentalmente, como se señala en la guía, [[ ]]
se introdujo en ksh88 (la versión de 1988 del shell Korn).
[[
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 queX
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 ANDcmd1 && 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.