Q:

Como criar, acessar e manipular arrays associativos?

Estou usando GNU-Bash no meu terminal MingW (bash --version: GNU bash, version 4.4.12(1)-release (i686-pc-msys)). Estou precisando criar um dicionário de dados para verificar se uma nova chave foi encontrada e associar essa nova chave a um índice. Para isso, creio que a melhor solução seria um array associativo.
Porém, não estou conseguindo fazer esse array funcionar!
Para testes, estou atribuindo valores incrementais às chaves, uma chave por linha. Por exemplo, espero obter os seguintes pares de chave/valor para essa entrada:
./array_assoc_platonico.sh << EOL
> bash
> scripting
> is
> tought
> as
> bash
> is
> pretty
> EOL
bash:1
scripting:2
is:3
tought:4
as:5
pretty:6

A impressão não me importa, mas o conteúdo do meu array deveria ser algo assim.
Meu script até o momento:
#!/bin/bash

NEXT_IDX=1
while read line; do
    if [ "x${chaves[$line]}" = "x" ]; then
        # então chave nova
        chaves[$line]=$NEXT_IDX
        NEXT_IDX=$(( NEXT_IDX + 1 ))

        echo "$line:${chaves[$line]}"
    fi
done

Entretanto, minha saída obtida está sendo:
./array_assoc_falho.sh << EOL
> bash
> scripting
> is
> tought
> as
> bash
> is
> pretty
> EOL
bash:1

Quando eu dou um declare -p chaves no final da leitura, obtenho o seguinte:
declare -a chaves=([0]="1")

Onde estou errando no uso do array associativo em bash?

A:

O correto é declare -A chaves, a variável "chaves" será tratada como uma matriz.
#!/bin/bash
declare -A chaves
NEXT_IDX=1
while read line; do
    if [ "x${chaves[$line]}" = "x" ]; then
        # então chave nova
        chaves[$line]=$NEXT_IDX
        NEXT_IDX=$(( NEXT_IDX + 1 ))

        echo "$line:${chaves[$line]}"
    fi
done

Saída:
bash:1
scripting:2
is:3
tought:4
as:5
pretty:6

Variáveis no Bash

Ao informar o parâmetro -a você cria um array indexado, ou seja, uma variável contendo uma lista onde os índices são números.
#!/bin/bash
declare -a CARROS=("Gol" "Argo" "C3" "Saveiro")
for ((I=0;I<3;I++)); do
    echo $I ${CARROS[I]};
done

A saída sera:
0 Gol
1 Argo
2 C3

O parâmetro -A tem seu funcionamento igual ao array indexado, a diferença é em utilizar como chave uma string ao invés de índice numérico.
O parâmetro -i define a variável como um número inteiro
$ declare -i NUMERO=2018
$ echo ${NUMERO}
2018
$ NUMERO+=2
$ echo ${NUMERO}
2020
$ NUMERO="UM NOME QUALQUER" # IRÁ RETORNAR ZERO
0

Os parâmetros -l e -u servem para converter string em minusculas e maiúsculas.
$ declare -l SITE="Pt.StaCkOverFlow.com"
$ echo ${SITE}
pt.stackoverflow.com
$ declare -u SITE="pt.stackoverflow.com"
$ echo ${SITE}
PT.STACKOVERFLOW.COM

O parâmetro -r torna a variável somente leitura.
$ declare -r VAR="Minha variável"
$ echo ${VAR}
Minha variável
$ VAR="Novo conteúdo" # FOI DECLARADA COMO LEITURA, RETORNARA ERRO
./teste.sh: line 5: VAR: a variável permite somente leitura

O parâmetro -p serve para exibir os atributos e os valores de uma variável.
$ declare -a VAR=("Corsa" "Gol" "Palio" "Uno")
$ declare -p VAR
declare -a VAR='([0]="Corsa" [1]="Gol" [2]="Palio" [3]="Uno")'

