'while read line do' 결과: Linux bash 스크립트에서 "예기치 않은 마커 'done' 근처에 구문 오류가 발생했습니다."

'while read line do' 결과: Linux bash 스크립트에서 "예기치 않은 마커 'done' 근처에 구문 오류가 발생했습니다."

Solaris 플랫폼에서는 제대로 실행되지만 Linux 플랫폼에서는 작동하지 않는 쉘 스크립트가 있습니다. 실패한 코드 조각은 다음과 같습니다.

[...]
while read line
do
insert_into_table="insert into isam_subrack_tbl (select neId, friendlyName, eqptHolderActualType from $line)"
$MYSQL_HOME/bin/mysql --socket=/tmp/mysql.sock -u$MYSQL_USER -p$MYSQL_PWD  --host $MYSQL_HOST -Demlplatform -e "$insert_into_table"
done  < isam_subrack2.txt 2> /dev/null
[...]

디버그 모드에서 스크립트를 실행하면 다음과 같습니다.

bash-4.1$ sh -vvx test.sh
[...]
while read line
do
insert_into_table="insert into isam_subrack_tbl (select neId, friendlyName, eqptHolderActualType from $line)"
$MYSQL_HOME/bin/mysql --socket=/tmp/mysql.sock -u$MYSQL_USER -p$MYSQL_PWD  --host $MYSQL_HOST -Demlplatform -e "$insert_into_table"
done  < isam_subrack2.txt 2> /dev/null
test.sh: line 98: syntax error near unexpected token `done'
'est.sh: line 98: `done  < isam_subrack2.txt 2> /dev/null

명령을 시도했지만 dos2unix도움이 되지 않았습니다.
while 루프에서 왜 이 오류가 발생하는지 아시나요?

답변1

문제에 대한 단서는 다음과 같습니다.

test.sh: line 98: syntax error near unexpected token `done'
'est.sh: line 98: `done  < isam_subrack2.txt 2> /dev/null

두 번째 줄은 대개 다음과 같습니다.

test.sh: line 98: `done  < isam_subrack2.txt 2> /dev/null'

보시다시피 오류 메시지의 뒤따르는 따옴표는 줄의 시작 부분에 있습니다. 이는 텍스트 파일에 예상치 못한 CR 문자가 나타나는 증상입니다. 이미 파일을 실행하신 것으로 확인되지만 dos2unix, 다음과 같이 다시 실행하는 것이 좋습니다.

tr -d '\015' < src.sh > dst.sh

관련 정보