다음과 같이 함께 결합하고 싶은 약 10k(약 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'"'
OS: 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.