2010-03-10 25 views
23

acabo tropezado con la sintaxis bash:

foo=42 
bar=$[foo+1] # evaluates an arithmetic expression 

Cuando busqué en Google para esto, he encontrado http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html#sect_03_04_05 :

3.4.6. Expansión aritmética

La expansión aritmética permite la evaluación de una expresión aritmética y la sustitución del resultado. El formato para la expansión aritmética es:

$((EXPRESSION)) 

...

Siempre que sea posible, los usuarios del golpe deben tratar de usar la sintaxis con corchetes:

$[ EXPRESSION ] 

Sin embargo, esto sólo calcular la resultado de EXPRESIÓN, y no hacer pruebas ...

En mi página bash man solo puedo encontrar el $((EXPRESSION)) forma, tal como:

foo=42 
bar=$((foo+1)) # evaluates an arithmetic expression 

Entonces, ¿qué pruebas no se realizan con $[...] que hacer con $((...)), o es sólo una versión de la $[...] legado de $((...))?

+1

Para una perspectiva histórica, vea http://stackoverflow.com/a/40048865/2908724. – bishop

Respuesta

29

La página de manual para la v3.2.48 fiesta dice:

[...] El formato de expansión aritmética es:

 $((expression)) 

El formato antiguo $ [expresión] está en desuso y se eliminará en las próximas versiones de bash.

So $[...] es una sintaxis antigua que ya no se debe usar.

+5

Tenga en cuenta que el texto exacto no está en [* the * página de manual de bash] (http://tiswww.case.edu/php/chet/bash/bash.html), está en * algunas * páginas de bash man (por ejemplo, [Debian] parche esto] (http://patch-tracker.debian.org/patch/series/view/bash/4.1-3/man-arithmetic.dpatch)). La característica ha quedado en desuso desde bash-2.0, pero persiste hoy (bash-4.2). –

9

@sth es del todo correcto. Y en caso de que sienta curiosidad acerca de por qué una sintaxis más detallada ahora está a favor, consulte este correo electrónico anterior de la lista de correo.

http://lists.gnu.org/archive/html/bug-bash/2012-04/msg00033.html

“En los primeros propuestas, se utilizó un formulario $ [expresión]. Era funcionalmente equivalente al "$ (())" del texto actual, pero las objeciones eran presentadas que el 1988 KornShell ya había implementado "$ (())" y no había una razón convincente para inventar otra sintaxis . Por otra parte, el "$ []" sintaxis tenían una incompatibilidad menores que corresponden a los patrones en las declaraciones de casos.”

No estoy seguro de que me gusta la lógica‘pero alguien ya lo ha hecho con más palabras,’pero hay lo tienes, tal vez el problema de la declaración de caso fue más convincente de lo que imagino a partir de esta mención oscura?