Bash - сохранение значения ключа в переменных, объявленных в ассоциативном массиве

1065
Rajib

Я пытаюсь создать ассоциативный массив в bash, содержащий имя файла (видео) и его продолжительность. Код является:

#!/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[@]}" 

Я хочу передать имя файла и сохранить его в переменной ключа, а продолжительность в переменной значения. На самом деле продолжительность будет запрашиваться через ffprobe, но это несущественно на данный момент, потому что значения не передаются в переменные правильно.

Результаты:

$ 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 

Длительность и имя файла, похоже, входят в значение, а ключ, похоже, просто выводит имена переменных. Также, если я объявлю массив таким образом:

declare -A MYMAP=[$filename]=$ 

хотя он удаляет предупреждение, он по-прежнему выводит мусор.

0
Ошибка в строке 6 заключается в том, что она должна быть «объявить -A MYMAP». Строка `MYMAP [duration] = 10` создает индекс со строкой `uration`, без значения` $ duration`, а также с строкой `MYMAP [filename] = ...`. Переменные `$ duration` и` $ filename` не объявлены, доступны ли они сценарию? (edit- ксеноид побил меня, пока я медленно писал) Paulo 6 лет назад 0

1 ответ на вопрос

0
xenoid

А ассоциативный массив использует строки в качестве индексов для получения значений. Он работает как простой массив, где вы используете строки вместо целых чисел для адресации содержимого.

# 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 $