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.
Respostas:
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:
não procura uma variável chamada
value
, mas usa a stringvalue
literalmente. 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
(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
fonte
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:
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.
fonte
É o
regras para esse idioma.
Para o bash, as regras são que o texto é literal, a menos que você use o
"#{name}"
formato.Veja também https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
fonte
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.
fonte