"예기치 않은 태그 근처의 구문 오류"가 발생하는 이유는 무엇입니까? [폐쇄]

"예기치 않은 태그 근처의 구문 오류"가 발생하는 이유는 무엇입니까? [폐쇄]

약 10,000개(약 180x50x2)의 CSV 파일이 있고 아래와 같이 이를 결합하고 싶지만 어떤 이유로 내부 for 루프가 실패합니다 syntax error.lastFile

#!/bin/bash
dir='/home/masi/CSV/'
targetDir='/tmp/'
ids=(118 119 120)
channels=(1 2)
for id in ids;

        do
        for channel in channels;

                # example filename P209C1T720-T730.csv
                lastFile="$dir'P'$id'C'$channel'T1790-T1800.csv'"
                # show warning if last file does not exist
                if [[ -f $lastFile ]]; then
                    echo "Last file "$lastFile" is missing" 
                    exit 1
                fi

                filenameTarget="$targetDir'P'$id'C'$channel'.csv'"
                cat $dir'P'$id'C'$channel'T'*'.csv' > $filenameTarget

        done;
done

실수

makeCSV.sh: line 12: syntax error near unexpected token `lastFile="$dir'P'$id'C'$channel'T1790-T1800.csv'"'
makeCSV.sh: line 12: `      lastFile="$dir'P'$id'C'$channel'T1790-T1800.csv'"'

운영 체제: Debian 8.5
Linux 커널: 4.6 백포트됨

답변1

do두 번째 for 루프에 하나가 없습니다.

for id in ids;

        do
        for channel in channels; do # <----- here ----

                # example filename P209C1T720-T730.csv
                lastFile="$dir'P'$id'C'$channel'T1790-T1800.csv'"
                # show warning if last file does not exist
                if [[ -f $lastFile ]]; then
                    echo "Last file "$lastFile" is missing" 
                    exit 1
                fi

                filenameTarget="$targetDir'P'$id'C'$channel'.csv'"
                cat $dir'P'$id'C'$channel'T'*'.csv' > $filenameTarget

        done;
done

댓글의 논의에 따르면 귀하가 루프 구문에 대해 혼동하고 계시다는 것을 알았습니다 for.

루프의 대략적인 구문은 다음과 같습니다 for.

for name in list; do commands; done

do명령 앞에는 항상 명령이 있어야 하고 ;명령 뒤에는 줄 바꿈(또는 개행)이 있어야 합니다.done

다음은 더 많은 개행 문자를 사용한 변형입니다.

for name in list
do
    commands
done

답변2

잘 작동합니다:

#!/bin/bash
dir='/home/masi/CSV/'
targetDir='/tmp/'
ids=(118 119 120)
channels=(1 2)
for id in ids ; do

        # Add do after ';'
        for channel in channels ; do

                # example filename P209C1T720-T730.csv
                lastFile="$dir'P'$id'C'$channel'T1790-T1800.csv'"
                # show warning if last file does not exist
                if [[ -f $lastFile ]] ; then
                    echo "Last file "$lastFile" is missing" 
                    exit 1
                fi

                filenameTarget="$targetDir'P'$id'C'$channel'.csv'"
                cat $dir'P'$id'C'$channel'T'*'.csv' > $filenameTarget

        done
done

나중에 bash 디버거와 함께 사용하려면 다음을 수행하세요.bash -x /path/to/your/script.

관련 정보