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

관련 정보