Originariamente inviato da Guglie
ok, ho rinunciato a voler usare bash: lo sto scrivendo in C++ usando libxmlpp
Utilizzando bash, 'appiattirei' l'array in questo modo:
codice:
#!/bin/bash
#
# === struttura origine, campi separati da '\n' ===
# [nome1]
#       descrizione=descrizione1
#       comando=comando1
#
# === struttura finale, campi separati dal ':' ===
# nome1:descrizione1:comando1
#

declare -a comandi      ### vettore per i dati
indice=-1               ### indice per il vettore
campo=""                ### il singolo campo

while read riga; do
        ### verifico se inizia un nuovo record
        if echo "$riga" | grep -e "^\[.*\][:space:]*$" >/dev/null; then
                ### incremento indice ed assegno il campo
                let ++indice
                campo=$(echo -n "$riga" | sed -e "s/^\[\(.*\)\][:space:]*$/\1/")
        else
                ### verifico che sia una riga per le descrizioni/comandi
                if echo "$riga" | grep -e "^[:space:]*.*[:space:]*=[:space:]*.*[:space:]*$" >/dev/null; then
                        ### assegno il campo
                        campo=$(echo -n "$riga" | sed -e "s/^[:space:]*.*[:space:]*=[:space:]*\(.*\)[:space:]*$/\1/")
                else
                        ### ignoro spudoratamente ogni altra cosa
                        continue
                fi
        fi
### aggiorno il record corrente        
comandi[$indice]="${comandi[$indice]}${campo}:"
done

### output per mostrare quanto è stato fatto
for elementi in "${comandi[@]}"; do
        echo $elementi
done
Il test:
codice:
cacao74@winnie:~/tmp/bash$ cat elenco_comandi.txt
[nome_1]
        descrizione= descrizione 1
        comando = comando 1

[nome_2]
        descrizione= descrizione 2
        comando = comando 2

cacao74@winnie:~/tmp/bash$ bash array.sh < elenco_comandi.txt
nome_1: descrizione 1: comando 1:
nome_2: descrizione 2: comando 2:
Non so se può servirti.
Dovendo gestire array multidimensionali, ti inviterei caldamente a *riprovarci in perl*.

ciao