¿De dónde viene la expansión de variables recursivas en contextos numéricos bash / shell?
Los estados de especificaciones POSIX con respecto aExpansión Aritmética ese
[i] f la variable de shell x contiene un valor que forma una constante entera válida, que incluye opcionalmente un signo más o menos inicial, luego las expansiones aritméticas "$ ((x))" y "$ (($ x))" devolver el mismo valor
Que es un atajo razonable y limpia expresiones complicadas bastante bien.
bash (versiones3.2.25(1)-release
de CentOS 5 y4.3.33(1)-release
de debian inestable) así como ksh (Version AJM 93t+ 2010-06-21
de CentOS 5) todos parecen ir un paso más allá que eso sin embargo.
Todos parecen expandir recursivamente las variables encontradas en la expansión aritmética (y los contextos numéricos en[[
resultante del uso de los operadores numéricos).
Específicamente:
$ set -x
$ bar=5
+ bar=5
$ foo=bar
+ foo=bar
$ [ foo -gt 4 ]; echo $?
+ '[' foo -gt 4 ']'
-bash: [: foo: integer expression expected
+ echo 2
2
$ [[ foo -gt 4 ]]; echo $?
+ [[ foo -gt 4 ]]
+ echo 0
0
$ [[ foo -eq 0 ]]; echo $?
+ [[ foo -eq 0 ]]
+ echo 1
1
$ [[ foo -eq 5 ]]; echo $?
+ [[ foo -eq 5 ]]
+ echo 0
0
$ (( foo == bar )); echo $?
+ (( foo == bar ))
+ echo 0
0
$ (( foo == 1 )); echo $?
+ (( foo == 1 ))
+ echo 1
1
¿De dónde viene este comportamiento y por qué sería deseable?
Hace uso[[
en lugar de[
explícitamenteMenos seguro cuando se usa con operadores numéricos porque los valores no válidos y los errores tipográficos pasan de ser errores de script a pruebas silenciosamente válidas (pero probablemente erróneas).
Editar: como una pregunta secundaria si alguien sabecuando esta "característica" se agregó a bash / etc. Me interesaría saber eso también.