2017-03-05 3 views
1

Ich möchte ein assoziatives Array in Bash mit Dateinamen erstellen, die von einem Glob als Schlüssel abgeleitet sind. Hier ist, was ich tue:Erstellen eines assoziativen Bash-Arrays mit glob-Ausgabe

declare -A file_hash 
for file in *; do 
    file_hash+=([$file]=1) 
done 

Ich bin gespannt zu sehen, ob es ein einfacher Weg, um die gleiche Sache zu tun, ein wenig wie, wie wir initialisieren ein normales Array auf diese Weise:

file_array=(*) 

Eine der Ideen, die ich aus another Beitrag auf SO bekam ist:

file_array=(*) 
declare -A file_hash=($(echo ${file_array[@]} | sed 's/[^ ]*/[&]=&/g')) 

ist das der beste Weg?

+2

Inspiriert von der Echo-Methode funktioniert dies in einigen Tests OK, erfordert aber eval: 'declare -A filehash; eval $ (printf 'filehash + = (["% s"] = 1);' * .txt) ' –

Antwort

2

Ihre Schleife ist der richtige Weg, dies zu tun. Alles andere Risiken nicht richtig Dateinamen Umgang mit Zeichen enthält, die die Schale speziell behandeln kann, nämlich Leerzeichen (und Zeilenumbrüchen im Besonderen) und glob Metazeichen wie *, [], ? usw.

file_array=(*) arbeitet als Abkürzung für die längere, explizite Form

file_array=([0]=file1 [1]=file2 ...) 

weil die Indizes 0, 1, ... kann aus der Folge von Dateien aus der glob Expansion zu entnehmen. Mit einem assoziativen Array können Sie keine solche Annahme treffen, und die Schlüssel und Werte müssen explizit angegeben werden.

Verwandte Themen