Eu tenho o mesmo problema exato descrito neste post do SO ("bash associative array key string com dois pontos está dando erro"): https://stackoverflow.com/q/40406187/10639803
A solução é usar declare -A
, mas assim que faço isso, minha matriz associativa deixa de ser global.
Existe uma maneira de declare -A
tê -lo global?
ATUALIZAÇÃO: tentei declare -gA
conforme descrito aqui: https://stackoverflow.com/a/21151984/10639803 mas não funciona para mim por algum motivo: Assim que sair do loop que preenche meu array associativo (hashmap), o array fica desarmado.
Aqui está o código bash real (os comandos echo dentro do loop são para verificar se os valores são realmente extraídos e atribuídos):
declare -gA HOSTS_START_MAP
find "$TEMP" -type f -name "debug.log*" -exec grep -F "STARTING HOST " {} \; |
while IFS= read -r HOST_START_LINE; do
if [[ $HOST_START_LINE =~ (.*)(DEBUG)(.*)(STARTING HOST)([ 0-9]*)(.*)(CALCULATION) ]]
then
HOST_START_TIME=$(echo "${BASH_REMATCH[1]}" | xargs)
HOST_NAME=$(echo "${BASH_REMATCH[6]}" | xargs)
# echo ">$HOST_NAME< ... >$HOST_START_TIME<"
HOSTS_START_MAP[$HOST_NAME]=$HOST_START_TIME
# echo $HOST_NAME --- ${HOSTS_START_MAP[$HOST_NAME]}
fi
done
echo ${#HOSTS_START_MAP[@]}
for MYKEY in "${!HOSTS_START_MAP[@]}"; do echo $MYKEY --- ${HOSTS_START_MAP[@]}; done
O problema que você está vendo não tem nada a ver com a declaração da variável. É porque você está definindo a variável em um subshell e esperando que seus valores estejam disponíveis no pai.
Você pode ver esse efeito aqui, usando a mesma estrutura do seu código, mas um exemplo muito mais simples:
Felizmente, ao usar
bash
, há uma solução rápida disponível reescrevendo o código em uma forma diferente:Em código real, use
while IFS= read -r item
para garantir queitem
recebe entrada não processada. Eu omiti as proteções para o que espero que seja clareza nos exemplos.Nos comentários desta resposta, você solicitou uma versão revisada do seu código. Não posso testá-lo, e é por isso que hesitei em colocá-lo aqui em primeiro lugar, mas deve ficar assim: