Bash - Speichern des Schlüsselwerts in im assoziativen Array deklarierten Variablen

918
Rajib

Ich versuche, ein assoziatives Array in bash zu erstellen, das den Namen einer Datei (ein Video) und deren Dauer enthält. Der Code lautet:

#!/bin/sh  shopt -s nullglob movie=(*.mp4)  declare -A MYMAP[$filename]=$  total=${#movie[*]}  for (( i=0; i<=$(( $total -1 )); i++ )) do  MYMAP[duration]=10 MYMAP[filename]=$ echo "$" echo "${!MYMAP[@]}"  done  echo "${#MYMAP[@]}" 

Ich möchte den Dateinamen übergeben und in der Schlüsselvariablen und die Dauer in der Wertvariablen speichern. Die Dauer wird tatsächlich über ffprobe abgefragt. Dies ist jedoch zu diesem Zeitpunkt unerheblich, da die Werte nicht korrekt in die Variablen übergeben werden.

Die Ergebnisse sind:

$ sh test2.sh test2.sh: line 6: MYMAP[]: bad array subscript 10 File_01.mp4 duration filename 10 File_02.mp4 duration filename 10 File_03.mp4 duration filename 10 File_04.mp4 duration filename 10 File_05.mp4 duration filename 2 

Die Dauer und der Dateiname scheinen beide in den Wert zu geraten, und der Schlüssel scheint nur die Variablennamen auszugeben. Auch wenn ich das Array so deklariere:

declare -A MYMAP=[$filename]=$ 

Obwohl es die Warnung entfernt, gibt es immer noch Müll aus.

0
Der Fehler in Zeile 6 liegt darin, dass es sich um `declare -A MYMAP` handeln sollte. Die Zeile "MYMAP [duration] = 10" erstellt einen Index mit der Zeichenfolge "duration", nicht den Wert von "$ duration", sowie die Zeile "MYMAP [Dateiname] = ...". Die Variablen "$ duration" und "$ filename" werden nicht deklariert. Stehen sie dem Skript zur Verfügung? (edit-xenoid schlug mich dabei, als ich langsam schrieb) Paulo vor 3 Jahren 0

1 Antwort auf die Frage

0
xenoid

Und assoziative Arrays verwenden Strings als Indizes, um Werte abzurufen. Es funktioniert wie ein einfaches Array, in dem Sie Strings anstelle von ganzen Zahlen verwenden, um den Inhalt zu adressieren.

# Declare the array declare -A durations  # Two movies sw1="ANewHope.mp4" sw2="EmpireStrikesBack.mp4"  # Store values durations[$sw1]=3600 durations[$sw2]=7200  # Retrieve values echo $ echo $  # The movies echo ${!durations[@]}  # The durations echo $