2012-05-08 12 views
8

Due cose, prima questa è la mia prima domanda in questo forum e mi scuso se la formazione è dappertutto. Secondo, non ho scritto molti script di bash, e tra un copione e l'altro produco un tempo piuttosto lungo.

Detto questo, ecco la mia domanda.

E 'possibile fare qualcosa di simile in bash (Cancella array $ array contiene):
$array=()

Fondamentalmente questo è quello che vorrei fare. Ho una variabile con i nomi delle variabili matrice in esso:

array1=() 
array2=() 
arrayList="array1 array2" 


# In a function far far away 
for array in $arrayList 
do 
    eval arr=("\"\${$array[@]\"") 

    for index in ${!arr[@]} 
    do 
     echo "${arr[$index]}" 
    done 
    # Here is the big "?", I like to clear the array that $array refers to. 
    $array=() 
done 

mie matrici contengono stringhe che includono "" (spazio) e questo è il motivo per cui io uso la dichiarazione eval. Non sono sicuro che sia necessario ma almeno funziona. La sceneggiatura è più o meno funzionante come lo voglio anch'io, ma ho bisogno di cancellare gli array nello $arrayList, e preferisco non inserirla con un hardcode da qualche parte, anche se sarebbe facile.

Grazie in anticipo.

+0

Vedi http://mywiki.wooledge.org/BashFAQ/048 re: uso di eval - la forma abbreviata è che non è una pratica consigliata. –

+0

Grazie per il link! Ho letto che "eval" non è un modo raccomandato di andare visto che è possibile iniettare cose cattive, o anche fare cose stupide da soli se non si presta attenzione a ciò che si evita. Prenderò in considerazione la possibilità di scambiarlo per un'altra soluzione, anche se questo script verrà utilizzato solo da me. – Qben

+0

Forse quello che vuoi veramente sono gli array associativi. Sono disponibili in bash 4. – Dunes

risposta

11

Probabilmente la cosa più semplice da fare è solo unset. Una variabile unset agirà in modo identico a un array vuoto nella maggior parte dei contesti e unset $array dovrebbe funzionare correttamente.

+0

Vuoi dire che potrebbe essere così facile? :) Ho pensato che avrebbe semplicemente disinserito la variabile $ array lasciando $ array1 e $ array2 intatti.Ma dopo aver testato il tuo suggerimento sembra promettente. Grazie mille! – Qben

+0

@Qben 'unset array' annullerebbe la stessa variabile dell'array; 'Unset $ array' funziona come-pubblicizzato. –

+0

@Qben: Quando si "annulla" indirettamente come quello, consiglio di quotare la variabile: 'unset" $ array "' –

1

Non è possibile fare $foo=barsempre - non è così che i compiti indiretti in bash funzionano. Sfortunatamente, mentre è in grado di eseguire assegnazioni di array indiretti è una funzione disponibile in ksh93, non è una funzionalità disponibile formalmente documentata in bash.

Citando BashFAQ #6 (che deve essere letto per intero se siete interessati a saperne di più sull'utilizzo di variabili indirette in generale):

Non siamo a conoscenza di alcun trucco che può duplicare tale funzionalità in POSIX o Bourne shells (con l'uso di eval, che è estremamente difficile da fare in modo sicuro). Bash può quasi farlo - alcuni trucchi di array indiretti funzionano, mentre altri no, e non sappiamo se la sintassi implicata rimarrà stabile nelle versioni future. Quindi, considera questo un uso a tuo rischio.

# Bash -- trick #1. Seems to work in bash 2 and up. 
realarray=(...) ref=realarray; index=2 
tmp="$ref[$index]" 
echo "${!tmp}"   # gives array element [2] 

# Bash -- trick #2. Seems to work in bash 3 and up. 
# Does NOT work in bash 2.05b. 
tmp="$ref[@]" 
printf "<%s> " "${!tmp}"; echo # Iterate whole array. 

Tuttavia, la compensazione è più semplice, come unset $array funzionerà bene.

+0

Non penso che voglia il dereferenziamento, vuole solo svuotare l'array – c00kiemon5ter

+0

@ c00kiemon5ter, ma ma rispondere solo come svuotare un array lascerà qualcuno a chiedersi quando cercano di fare qualcos'altro. Ho aggiunto una risposta direttamente sul punto, ma penso che ci sia un valore nel rispondere alla domanda più ampia di "cosa dovrei fare invece di' $ array = ... '"? –

+0

Gli assegnamenti indiretti possono essere fatti in questo modo: 'declare $ foo = bar' –

-1
array=() 

Elimina l'array. Immagino che sia quello che volevi ..

+0

No, non lo è, hai perso il punto. La domanda riguarda l'indirezione. –

Problemi correlati