GNU/Linux >> Linux Esercitazione >  >> Linux

Array associativi negli script della shell?

Ho visto un trucco per implementare array associativi in ​​uno script di shell. Ad esempio print array["apples"] potrebbe essere scritto come echo $array$key dove chiave=mele.

Tuttavia, non è stato menzionato come generare le chiavi per eseguire l'iterazione sull'array.
L'unico modo a cui potevo pensare era archiviare le chiavi in ​​una variabile delimitata da spazi in modo da poter utilizzare un ciclo for per eseguire l'iterazione sull'array.

Quindi, c'è un altro modo per memorizzare le chiavi per un uso successivo?

Risposta accettata:

Shell con array associativi

Alcune shell moderne forniscono array associativi:ksh93, bash ≥4, zsh. In ksh93 e bash, se a è un array associativo, quindi "${!a[@]}" è l'array delle sue chiavi:

for k in "${!a[@]}"; do
  echo "$k -> ${a[$k]}"
done

In zsh, quella sintassi funziona solo in modalità di emulazione ksh. Altrimenti devi usare la sintassi nativa di zsh:

for k in "${(@k)a}"; do
  echo "$k -> $a[$k]"
done

${(k)a} funziona anche se a non ha una chiave vuota.

In zsh, puoi anche eseguire il loop su entrambi k eys e v alori allo stesso tempo:

for k v ("${(@kv)a}") echo "$k -> $v"

Shell senza array associativi

L'emulazione di array associativi in ​​shell che non li hanno è molto più lavoro. Se hai bisogno di array associativi, è probabilmente il momento di utilizzare uno strumento più grande, come ksh93 o Perl.

Se hai bisogno di array associativi in ​​una semplice shell POSIX, ecco un modo per simularli, quando le chiavi sono limitate a contenere solo i caratteri 0-9A-Z_a-z (cifre, lettere e trattino basso ASCII). Sotto questo presupposto, le chiavi possono essere utilizzate come parte dei nomi delle variabili. Le funzioni seguenti agiscono su un array identificato da un prefisso di denominazione, lo “stem”, che non deve contenere due caratteri di sottolineatura consecutivi.

## ainit STEM
## Declare an empty associative array named STEM.
ainit () {
  eval "__aa__${1}=' '"
}
## akeys STEM
## List the keys in the associatve array named STEM.
akeys () {
  eval "echo "$__aa__${1}""
}
## aget STEM KEY VAR
## Set VAR to the value of KEY in the associative array named STEM.
## If KEY is not present, unset VAR.
aget () {
  eval "unset $3
        case $__aa__${1} in
          *" $2 "*) $3=$__aa__${1}__$2;;
        esac"
}
## aset STEM KEY VALUE
## Set KEY to VALUE in the associative array named STEM.
aset () {
  eval "__aa__${1}__${2}=$3
        case $__aa__${1} in
          *" $2 "*) :;;
          *) __aa__${1}="${__aa__${1}}$2 ";;
        esac"
}
## aunset STEM KEY
## Remove KEY from the associative array named STEM.
aunset () {
  eval "unset __aa__${1}__${2}
        case $__aa__${1} in
          *" $2 "*) __aa__${1}="${__aa__${1}%%* $2 } ${__aa__${1}#* $2 }";;
        esac"
}

(Attenzione, codice non testato. Il rilevamento degli errori per stem e chiavi sintatticamente non validi non è fornito.)

Correlati:Linux – supporto lento – ottimizzazione della cache del disco?
Linux
  1. Blocco corretto negli script della shell?

  2. Array in Unix Bourne Shell?

  3. Come eliminare i privilegi di root negli script della shell?

  4. Nascondere la password negli script della shell?

  5. Estensioni di file per script di shell Unix?

Come creare script di shell

Array negli script di shell

Come utilizzare if-else negli script della shell?

Comprendere il ciclo for negli script della shell

Il ciclo while negli script della shell

Esecuzione di script da un'altra directory