Bash - Armazenando o valor da chave em variáveis declaradas na Matriz Associativa

0

Estou tentando criar um array associativo no bash contendo o nome de um arquivo (um vídeo) e sua duração. O código é:

#!/bin/sh

shopt -s nullglob
movie=(*.mp4)

declare -A MYMAP[$filename]=${duration}

total=${#movie[*]}

for (( i=0; i<=$(( $total -1 )); i++ ))
do

MYMAP[duration]=10
MYMAP[filename]=${movie[i]}
echo "${MYMAP[@]}"
echo "${!MYMAP[@]}"

done

echo "${#MYMAP[@]}"

Eu quero passar o nome do arquivo e armazená-lo na variável de chave e a duração na variável de valor. A duração será realmente consultada através de ffprobe, mas isso é irrelevante neste ponto, porque os valores não estão sendo passados para as variáveis corretamente.

Os resultados são:

$ 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

A duração e o nome do arquivo parecem estar entrando no valor, e a chave parece estar apenas exibindo os nomes das variáveis. Além disso, se eu declarar o array desta maneira:

declare -A MYMAP=[$filename]=${duration}

apesar de remover o aviso, ele ainda gera lixo.

    
por Rajib 29.03.2018 / 06:17

1 resposta

0

E o array associativo usa strings como índices para recuperar valores. Funciona como um array simples onde você usa strings ao invés de inteiros para endereçar o conteúdo.

# 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 ${durations[$sw1]}
echo ${durations[$sw2]}

# The movies
echo ${!durations[@]}

# The durations
echo ${durations[@]}
    
por 29.03.2018 / 15:07

Tags