Como eu faria para obter os valores das variáveis ​​locais e globais no Bash, ignorando quaisquer funções e variáveis ​​de ambiente?
declare -p
dá-me todo o grupo. Mas não está claro se posso confiar no formato de saÃda de declare -p
. Da help declare
saÃda também não é óbvio se declare -p
pode incluir funções ou não. A experimentação sugere que não.
Exemplo: existem variáveis ​​cuja saÃda será semelhante a:
declare -- VARNAME="Variable value"
... e outros onde as opções declare
são dadas em vez de --
, por exemplo:
declare -ir UID="197609"
Agora, se eu soubesse que posso confiar nesse formato para a saÃda de declare
, poderia simplesmente usar um while
loop semelhante a este para limitar a saÃda a variáveis ​​inteiras somente leitura:
while read -r decl opts keyval; do
if [[ "$opts" == *ir* ]]; then # could obviously also be case/esac
echo "$keyval"
fi
done < <(declare -p)
... e, assim, eliminar os tipos de variáveis ​​nas quais não estou interessado.
Pergunta: Mas posso confiar que este seja o caso? Se não, que outro método conciso existe para filtrar as variáveis ​​por alguns critérios?
NB: Estou interessado em Bash >=5.0 e atualmente estou usando 5.2.15 em minha máquina.
Você pode consultar o tipo de variáveis ​​usando
typeset
/declare
-p
.+F
exclui funções e as variáveis ​​definidas por meio do ambiente são marcadas-x
, para que possamos fazer a expressão regular disso tudo:se você só precisa dos nomes:
Em
bash
:Onde
comm
subtrai ase
variáveis ​​exportadas da lista de todasv
as variáveis.Com
zsh
:$parameters
é uma matriz associativa especial que mapeia nomes de parâmetros para sua lista de tipos e atributos.Aqui, nós
print
,r
aw,o
ordenamos em1
C
olumn osk
olhos daquele array associativo para o qual o valor não contémexport
.Você também pode querer excluir os
special
,hide
ouundefined
(prontos para serem carregados automaticamente).