Basicamente, o Bash tem variáveis escalares simples, matrizes e matrizes associativas. Além disso, os escalares podem ser marcados como inteiros com o declare
builtin . Do ponto de vista do usuário do programador de script / shell, as variáveis de cadeia agem como strings, as variáveis inteiras agem como inteiros e as matrizes de acordo com seu tipo. A implementação interna não é muito relevante.
Mas, se quisermos saber como os dados são realmente armazenados na memória, devemos examinar o código-fonte para ver o que o programa realmente faz.
No Bash 4.4, os escalares são armazenados como strings, independentemente da tag inteira. Isso fica visível na definição de struct variable
/ the SHELL_VAR
typedef e na função make_variable_value
, que traduz explicitamente inteiros para strings para armazenamento.
As matrizes são armazenadas no que parece ser uma lista vinculada ( array.h
) e matrizes associativas como tabelas hash. Os valores dentro deles são novamente armazenados como strings. A escolha de uma lista vinculada para matrizes pode parecer estranha, mas como as matrizes podem ser esparsas e os índices podem ser números arbitrários, independentemente de quantos elementos a matriz contenha, essa escolha de design é um pouco mais fácil de entender.
No entanto, o código também contém uma definição para o union _value
não utilizado, com campos para números inteiros, números de ponto flutuante, assim como valores de string. Ele está marcado em um comentário como "para o futuro", então é possível que alguma versão futura do Bash armazene diferentes tipos de escalares em seus formulários nativos.