Bash의 변수 오류

Bash의 변수 오류

Bash에서 첫 번째 코드를 작성하고 있습니다. 2시간 동안 갇혀 있었어요. 이것은 내 코드입니다.

#!/bin/bash
declare -i l=0
declare -i d=0
declare -i s1=0
declare -i s2=0
declare -i t=0
declare -i o=0
declare -i p=0
for i in demo_room/subject_1/?*
do
    if [ "${i:0:1}" = "l" ];
    then
            ((l++));
            echo "l=$l"
            python motempl_n.py $i $l

    elif [  "${i:0:1}" = "d" ];
    then
            ((d++));
            echo "d=$d"
            python motempl_n.py $i $d

    elif [  "${i:0:1}" = "o" ];
    then
            o=$((o+1));
            echo "o=$o"
            python motempl_n.py $i $o

    elif [ "${i:0:1}" = "p" ];
    then
            p=$((p+1));
            python motempl_n.py $i $p

    elif [  "${i:0:1}" = "t" ];
    then
            t=$((t+1));
            python motempl_n.py $i $t

    elif [  "${i:0:7}" = "slide_1" ];
    then
            s1=$((s1+1));
            python motempl_n.py $i $s1

    #elif [  "${i:0:7}" == 'slide_2' ]
    else
            s2=$((s2+1));
            python motempl_n.py $i $s2

   fi 
done

그래서 폴더가 있습니다 demo_room/subject_1. 이 폴더에는 140개의 avi 비디오가 있으며 이름은 다음과 같습니다.

20개 동영상의 dislike_01이름은 다음과 같습니다.dislike_20

20개 동영상의 like_01이름은 다음과 같습니다.like_20

20개 동영상의 ok_01이름은 다음과 같습니다.ok_20

20개 동영상의 point_01이름은 다음과 같습니다.point_20

20개 동영상의 slide_1_01이름은 다음과 같습니다.slide_1_20

20개 동영상의 slide_2_01이름은 다음과 같습니다.slide_2_20

20개 동영상의 take_a_picture_01이름은 다음과 같습니다.take_a_picture_1_20

내가 하고 싶은 것은 먼저 입력 비디오의 클래스를 찾은 다음 Python 파일에 대한 입력으로 표시되도록 하는 것입니다. 폴더의 처음 20개 비디오 subject_1dislike1개이므로 이 코드는 제대로 작동하지만 21번째 비디오는 작동 like_01하지만 Python 코드에 전달하는 매개변수는 21입니다.

하지만 이는 for 루프에서 유사한 클래스의 첫 번째 비디오이므로 1이어야 합니다. 매번 값을 인쇄합니다 $d. 이는 매번 2nd 를 입력한다는 의미입니다 if condition. Python 코드에서 동영상 이름이 이고 like_01전달된 두 번째 값이 임을 확인할 수 있습니다 21. 왜? 이는 140개 동영상 모두에서 발생합니다.

답변1

귀하의 경로 $i에는 전체 경로( demo_room/subject_1/file)가 포함되므로 항상 로 시작됩니다 d.

다음을 수행할 수 있습니다.

case "${i##*/}" in
  (d*) ...;;
  (l*) ...;;
  (slide1_*) ...;;
  ...
esac

${i##*/}$i일치하는 위치의 앞부분을 제거했습니다 */.

또한 sh/bash에는 인용 매개변수 확장이 필요합니다.

python motempl_n.py "$i" "$s2"

답변2

코드가 잘 작성되었음에도 불구하고 여전히 중복되는 부분이 많습니다. 보다 간소화된 버전은 다음과 같습니다.

#!/bin/bash
declare -A count
for file in demo_room/subject_1/*; do
    base=${file##*/}
    case $base in
        slide_[12]*) key=${base:0:7};;
        [ldopt]*)    key=${base:0:1};;
        *)           ;; # other types ignored
    esac
    (( count[$key]++ ))
    echo "$key=${count[$key]}"
    python motempl_n.py "$file" "${count[$key]}"
done

나는 다른 정수 변수 대신 연관 배열을 사용했지만 운 좋게도 bash 산술은 이를 (( an_unset_variable++ ))우아하게 처리하고 변수에 "1"을 할당합니다.

파일 이름에는 항상 하나 이상의 문자가 포함되어 있으므로 일치하는 문자(0개 이상의 문자)가 없고 일치하는 파일(1개 이상의 문자)이 없기 때문에 ?귀하의 이름 은 중복됩니다.?**?*

답변3

변수 $i는 항상 d:으로 시작하며 demo_room … …
파일 이름을 추출해야 합니다. 추출 중이므로 파일의 이름과 번호도 추출할 수 있습니다.

따라서 스크립트의 더 짧은 버전은 다음과 같습니다.

#!/bin/bash

declare -Ai count

for i in ./demo_room/subject_1/?*; do
    j=${i##*/} ; name=${j%_*} ; number=${j##*_}
    ((count[$name]++))
    echo \
           python motempl_n.py "$i" "${count[$name]}"
done

echo "List of keys: " "${!count[@]}"

스크립트는 배열 변수만 사용하며 count, (에서) 사용된 (자동) 키 목록은 $name스크립트 끝에 인쇄됩니다.

echo \스크립트가 실제로 명령을 실행하는 방식이 마음에 들면 해당 줄을 주석 처리하세요.

관련 정보