¿Cuál es el concepto de lenguaje de programación para no evaluar una expresión por defecto en bash?

8

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.

Tim
fuente
¿Quién dijo que bash era un lenguaje de programación? y no, no es por una evaluación perezosa: esto también existe en otros idiomas sin el problema de la cadena
Christophe
8
@ ¿Quién dijo que bash era un lenguaje de programación? Bueno Wikipedia , Stack Overflow , reddit , wikilibros . Y esos son solo los que puedo nombrar antes de aburrirme. Al igual que Java, hay más cosas que llevan el nombre bash que solo el idioma. Pero sí, hay un lenguaje de programación bash.
candied_orange

Respuestas:

15

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:

varname=value

no busca una variable llamada value, pero usa la cadena valueliteralmente. 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.

echo "Hello ${name}!"

(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

amon
fuente
7

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:

typeset -i x
x=1
x=x+1
echo $x

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.

Jerry Jeremiah
fuente
Lo que usted dice es verdadero y útil, pero no responde la pregunta real, que era "¿cuál es el concepto de lenguaje de programación [...]"?
Andres F.
0

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.

Jeremy
fuente