Qual é o conceito da linguagem de programação para não avaliar uma expressão por padrão no bash?

8

No Bash, para aumentar um valor inteiro armazenado em uma variável, precisamos usar explicitamente a expansão aritmética.

 i=1
 i=$((i+1))

De outra forma

 i=1
 i=i+1

não avaliará a expressão i+1, mas atribuirá a expressão como uma sequência à variável.

Isso é muito natural se comparado a outras linguagens de programação, nas quais uma expressão é avaliada por padrão.

No design ou nos conceitos da linguagem de programação, existe um conceito ou terminologia para esse recurso no bash?

Qual é o sentido de não avaliar uma expressão, mas tratá-la como uma string por padrão?

Esse recurso está relacionado ao momento da avaliação, como a avaliação lenta?

Obrigado.

Tim
fonte
quem disse que bash era uma linguagem de programação? e não, não é por causa da avaliação preguiçosa: este existem em outros idiomas como bem sem o problema de cadeia
Christophe
8
@Quem disse que o bash era uma linguagem de programação? Bem , Wikipedia , Stack Overflow , reddit , wikibooks . E é isso que eu posso citar antes de ficar entediado. Assim como Java, há mais coisas usando o nome bash do que apenas a linguagem. Mas sim, existe uma linguagem de programação bash.
Candied_orange 22/10

Respostas:

15

Não há um conceito especial aqui. Em vez disso, tudo no shell é uma sequência literal, a menos que você use explicitamente uma expansão. Essa decisão de design facilita a atribuição, bem, de valores literais, que é o principal caso de uso de designações:

varname=value

não procura uma variável chamada value, mas usa a string valueliteralmente. No bash, a maioria dos caracteres "especiais", como + - /etc., não é de forma alguma especial - eles são apenas parte de palavras literais, assim como caracteres alfabéticos.

A sintaxe de expansão nos permite incorporar facilmente valores dentro de um modelo, por exemplo

echo "Hello ${name}!"

(Observe que, no shell, aspas gostam '…'ou "…"não delimitam seqüências de caracteres, elas alteram quais expansões são aplicadas - aspas simples suprimem todas as expansões e divisão de palavras, aspas duplas suprimem divisão de palavras e expansão glob, mas não expansão variável, expansão aritmética (somente Bash) ., ou a substituição de comando As seguintes palavras são equivalentes: foo\ bar, foo' 'bar, 'foo bar').

Uma conseqüência da abordagem "tudo é uma string por padrão" é que os programas que não usam apenas cadeias simples se tornam mais complicados. A sintaxe da matriz do Bash é notoriamente confusa. A expansão aritmética não é óbvia. No entanto, esses programas não são os mais adequados para shell scripts.

Leitura recomendada: A descrição POSIX da sintaxe e da semântica do shell: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html

amon
fonte
7

Você pode fazê-lo funcionar assim, se quiser. Tudo no shell é uma string literal, a menos que você diga explicitamente que é outra coisa. Por exemplo, o seguinte imprime 2:

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

Você só precisa dizer ao shell que a variável é um número inteiro em vez de uma string. O mesmo acontece se você quiser que a variável seja uma matriz.

Jerry Jeremiah
fonte
O que você diz é verdadeiro e útil, mas não responde à pergunta real, que era "qual é o conceito de linguagem de programação [...]"?
Andres F.
0

O conceito aqui é "compatibilidade com versões anteriores". O shell Bourne tratava tudo como strings, então o bash também deve, por padrão, ou todos os scripts anteriores ao bash quebrariam.

Jeremy
fonte