Bash- การจัดเก็บค่าคีย์ในตัวแปรที่ประกาศใน Associative Array


0

ฉันกำลังพยายามสร้างอาเรย์แบบเชื่อมโยงในทุบตีที่มีชื่อไฟล์ (วิดีโอ) และระยะเวลาของมัน รหัสคือ:

#!/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}

แม้ว่ามันจะเอาการเตือนมันยังคงส่งออกขยะ


ข้อผิดพลาดในบรรทัด 6 เป็นเพราะควรเป็น declare -A MYMAP. เส้น MYMAP[duration]=10 กำลังสร้างดัชนีด้วย duration สตริงไม่มีค่า $duration, เช่นกัน MYMAP[filename]=.... ตัวแปร $duration และ $filename ไม่ได้ประกาศจะมีให้สคริปต์หรือไม่ (แก้ไข - xenoid เอาชนะฉันไปในขณะที่ฉันเขียนช้า)
Paulo

คำตอบ:


0

และอาเรย์เชื่อมโยงใช้สตริงเป็นดัชนีเพื่อดึงค่า มันทำงานเหมือนอาร์เรย์ธรรมดาที่คุณใช้สตริงแทนจำนวนเต็มเพื่อจัดการกับเนื้อหา

# 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[@]}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.