En Bash, para aumentar un valor entero almacenado en una variable, necesitamos usar explícitamente la expansión aritmética.
i=1
i=$((i+1))
De otra manera
i=1
i=i+1
no evaluará la expresión i+1
, pero asignará la expresión como una cadena a la variable.
Esto es muy poco natural en comparación con otros lenguajes de programación, donde una expresión se evalúa por defecto.
En el diseño o los conceptos del lenguaje de programación, ¿hay un concepto o terminología para tal característica en bash?
¿Cuál es el punto de no evaluar una expresión sino tratarla como una cadena por defecto?
¿Esta característica está relacionada con el momento de la evaluación, como la evaluación diferida?
Gracias.
Respuestas:
No hay un concepto especial aquí. En cambio, todo en el shell es una cadena literal, a menos que use explícitamente una expansión. Esta decisión de diseño facilita la asignación, bueno, de valores literales, que es el caso de uso principal de las asignaciones:
no busca una variable llamada
value
, pero usa la cadenavalue
literalmente. En bash, la mayoría de los caracteres "especiales" como+ - /
etc. no son especiales de ninguna manera: son solo parte de palabras literales al igual que los caracteres alfabéticos.La sintaxis de expansión nos permite incrustar fácilmente valores dentro de una plantilla, p. Ej.
(Tenga en cuenta que en el shell, las comillas delimitan
'…'
o"…"
no delimitan cadenas, en cambio cambian las expansiones que se aplican: las comillas simples suprimen todas las expansiones y la división de palabras, las comillas dobles suprimen la división de palabras y la expansión global pero no la expansión variable, la expansión aritmética (solo Bash) ., o la sustitución de comandos Las siguientes palabras son equivalentes:foo\ bar
,foo' 'bar
,'foo bar'
).Una consecuencia del enfoque "todo es una cadena por defecto" es que los programas que no solo usan cadenas simples se vuelven más complicados. La sintaxis de la matriz de Bash es notoriamente confusa. La expansión aritmética es algo no obvio. Sin embargo, tales programas no son los más adecuados para los scripts de shell.
Lectura recomendada: la descripción POSIX de la sintaxis y semántica de shell: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
fuente
PUEDES hacer que funcione así si quieres. Todo en el shell es una cadena literal, a menos que explícitamente le digas que sea otra cosa. Por ejemplo, las siguientes impresiones 2:
Solo necesita decirle al shell que la variable es un número entero en lugar de una cadena. Lo mismo es cierto si desea que la variable sea una matriz.
fuente
Es el
reglas para ese idioma.
Para bash, las reglas son que el texto es literal a menos que use el
"#{name}"
formato.Consulte también https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
fuente
El concepto aquí es "compatibilidad con versiones anteriores". El shell Bourne trató todo como cadenas, por lo que bash también tiene que hacerlo de forma predeterminada o todos los scripts pre-bash se romperían.
fuente