Bash-在關聯數組中聲明的變數中儲存鍵值

Bash-在關聯數組中聲明的變數中儲存鍵值

我正在嘗試在 bash 中建立關聯數組,其中包含文件(影片)的名稱及其持續時間。代碼是:

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

我想傳遞檔案名稱並將其儲存在鍵變數中,並將持續時間儲存在值變數中。實際上將透過 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]=${duration}

儘管它刪除了警告,但它仍然輸出垃圾。

答案1

關聯數組使用字串作為索引來檢索值。它的工作方式類似於普通數組,您使用字串而不是整數來尋址內容。

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

答案2

我想我沒能清楚地表達我的問題,也許我應該把它歸結為一個問題XY 問題。我想做的就是收集檔案名稱mp4 檔案及其持續時間在關聯數組中作為鍵值對,其中檔案名稱作為鑰匙和持續時間作為價值觀。我完全以錯誤的方式對待它。

這似乎是一個合理的解決方案,其中電影檔案名稱被讀入,它們的持續時間同時被探測並一次性儲存。

希望這對某人有幫助。

 #!/bin/sh
    
    shopt -s nullglob
    
    declare -A DURATIONARR
    
    while IFS= read -r movie
    do 
    DURATIONARR[$movie]=$(ffprobe "$movie" 2>&1 | grep Duration | sed -e 's/^[[:space:]]*//g' | \
    awk '{print $2}' | tr -d ,)
    done< <(find . -name "*.mp4" -exec basename {} \;)
    
    printf "%s\n" "${!DURATIONARR[@]}" "${DURATIONARR[@]}" | pr -2t
    
    unset DURATIONARR

相關內容