매일 업데이트
2022-05-30 13:06 11 min

예기치 않은 토큰 근처의 Bash 구문 오류 수정

리눅스 Bash 터미널 환경에서 코딩하는 것은 현재 코딩 분야에서 보편적인 작업 방식이 되었습니다. 소프트웨어 엔지니어뿐만 아니라 프로그래밍 언어를 배우는 학생들도 종종 다양한 오류에 직면하게 됩니다. 만약 여러분이 '예기치 않은 토큰 `(` 근처의 구문 오류' 또는 이와 유사한 Bash 구문 오류를 반복적으로 마주쳤다면, 이 글에서 제시하는 방법들을 통해 숙련된 코더로 발돋움할 수 있을 것입니다. 아래에서 설명하는 해결 단계를 주의 깊게 따라 하고, 파일의 명령줄에서 발생하는 오류들을 정확하게 수정해 보세요.

Bash 구문 오류: '예기치 않은 토큰' 문제 해결 가이드

리눅스 Bash는 리눅스 기반 시스템을 위한 명령줄 인터프리터로, 전통적인 Bourne Shell (sh)을 대체하는 역할을 합니다. 리눅스 Bash 스크립트 파일은 일반적으로 .sh 확장자를 가집니다. 셸 스크립트 코드 내에 형식적인 문제가 있을 경우, 구문 오류가 발생할 수 있습니다. 특히 오류가 괄호 `(` 문자에 가까운 곳에서 발생하면, 셸은 해당 줄에 오류가 있음을 알리고, 그 줄의 오류 위치를 명시합니다. 리눅스 Bash는 인터프리터이기 때문에, 오류가 발생한 줄에서 실행이 중단되고, 터미널은 스크립트의 나머지 명령 스캔을 멈추게 됩니다. 따라서, 셸 스크립트에서 '예기치 않은 토큰' 오류를 해결하기 위해서는 오류가 있는 특정 명령줄을 수정한 후 다음 단계로 진행해야 합니다. 아래는 리눅스 Bash에서 '예기치 않은 토큰' 오류가 발생하는 주요 원인들입니다.

  • 이스케이프 시퀀스 사용 오류: Bash 스크립트 작성 시 이스케이프 시퀀스나 따옴표를 잘못 사용하면 오류가 발생할 수 있습니다. 이러한 오류를 해결하려면, 이스케이프 시퀀스와 따옴표를 정확한 형식으로 사용해야 합니다.

  • 부적절한 코드 구문: 루프 순서 변경 등 명령어가 잘못된 구문으로 작성된 경우, 구문 오류가 발생할 수 있습니다.

  • 명령어 사용법 오류: 변수 할당 오류와 같이 명령어를 올바르게 사용하지 않으면 구문 오류가 발생할 수 있습니다.

  • 운영체제 호환성 문제: 코딩 스크립트가 유닉스 시스템과 DOS 시스템 간에 호환되지 않을 경우, 예기치 않은 오류가 발생할 수 있습니다.

  • Bash 셸 스크립트 문제: 다른 시스템에서 복사한 파일의 Bash 셸 스크립트 실행 시 '예기치 않은 토큰' 오류가 발생할 수 있습니다.

이해를 돕기 위해, 예시로 `example.sh`라는 이름의 리눅스 Bash 스크립트 파일을 가정해 보겠습니다. 이 예제 파일에는 발생 가능한 모든 구문 오류가 포함되어 있습니다.

str= ‘스크립트에서 ‘(예제 파일)’의 첫 번째 명령줄’
str= [(1,2),(3,4)]
if[ $day == “mon” ] then
 echo “mon”
else
 echo “no mon”
fi
for VARIABLE in {0..2}; then
do echo command1; echo command2; echo command3; echo command4; done
while true; do if [ $ day == “mon” ]; then echo “mon”; else echo “not mon”; done; fi

방법 1: 각 명령줄에서 수동으로 오류 수정하기

첫 번째 방법은 스크립트의 각 명령줄에 있는 구문 오류를 수동으로 수정하는 것입니다. 다음은 명령줄에서 '예기치 않은 토큰' 오류를 해결하는 단계입니다. 먼저 터미널에서 `./example.sh` 명령어를 입력하고 엔터 키를 눌러 파일을 실행합니다.

2. 실행 결과에서 '예기치 않은 토큰' 오류가 발생한 줄을 확인합니다.

3. 각 오류 줄에 대해 아래에 설명된 방법을 적용하고 파일을 저장합니다.

4. 변경 후 파일을 다시 실행하여 구문 오류가 해결되었는지 확인합니다.

1단계: 파일 내용 확인하기

명령줄에서 구문 오류를 해결하는 첫 번째 단계는 터미널에서 파일 내용을 확인하는 것입니다. 파일에 문제가 있는 경우 파일 내용을 볼 수 없을 수 있습니다. 일반적으로 `./example.sh` 명령어를 사용하여 파일을 실행하여 파일 내용을 볼 수 있지만, 파일 내용을 직접 수정할 수는 없습니다. 따라서, 파일 내용을 확인하고 '예기치 않은 토큰 `(`'과 같은 구문 오류를 수정하기 위한 다양한 방법을 아래에서 소개합니다.

옵션 1: cat 명령어를 사용

첫 번째 옵션은 `cat` 명령어를 사용하여 셸 스크립트의 내용을 확인하는 것입니다. 터미널에 `cat -v example.sh` 명령어를 입력하여 `cat` 명령어를 사용해 오류가 있는 파일의 내용을 읽어옵니다.

참고 1: `example.sh`는 예시 파일 이름이며, 실제 오류가 발생한 파일의 이름을 입력해야 합니다.

참고 2: `cat -v` 명령어는 캐리지 리턴이나 공백 등 눈에 보이지 않는 문자를 표시하는 데 사용됩니다.

옵션 2: vx 명령어를 사용

`cat` 명령어를 사용할 수 없는 경우, `vx` 명령어를 사용하여 파일 내용을 확인하고 변경할 수 있습니다. 터미널에 `sh -vx ./example.sh` 명령어를 입력하여 파일을 엽니다.

옵션 3: od -a 명령어를 사용

3. 명령줄에 숨겨진 문자가 있는 경우, `od -a` 명령어를 사용하여 파일 내용을 확인할 수 있습니다. 파일 내용이 코드 파일에 제대로 표시되지 않는 경우, `od -a example.sh` 명령어를 사용하여 파일을 읽고 코드를 수정할 수 있습니다.

2단계: Windows 줄 바꿈 제거

셸 스크립트에 Windows 줄 바꿈이 있는 경우, 콘솔 명령을 사용하여 줄 바꿈을 제거하고 코드를 새로운 파일에 복사하여 오류를 수정할 수 있습니다.

다음 명령어를 터미널에 입력하여 파일 내용을 `correctedexample.sh`라는 새로운 파일에 저장하여 스크립트에서 Windows 줄 바꿈을 제거합니다.

tr -d 'r' <example.sh> correctedexample.sh

3단계: 새로 생성된 파일 권한 설정

셸에서 파일을 실행할 수 있도록 파일을 편집하려면, 새로 생성된 파일에 권한을 설정해야 합니다. 터미널에 `chmod 755 correctedexample.sh` 명령어를 입력하여 파일에 실행 권한을 부여합니다. 이제 수정된 파일을 열어 형식 문제를 수정하고 '예기치 않은 토큰 `(`)'과 같은 구문 오류를 수정할 수 있습니다.

4단계: 파일 코드 형식 지정

두 번째 단계는 코드 줄을 개별적으로 포맷하고 파일 내에서 명령줄을 수동으로 변경하는 것입니다. '예기치 않은 토큰 `(`' 오류를 수정하기 위해 파일 형식을 지정하는 방법을 아래에서 자세히 설명합니다.

옵션 1: 작은따옴표를 큰따옴표로 변경

명령줄에서 작은따옴표를 사용한 경우, 구문 오류를 수정하려면 작은따옴표를 큰따옴표로 변경해야 합니다. `example.sh` 파일에서 작은따옴표(`'`)가 사용된 코드 줄을 찾아서, 작은따옴표를 큰따옴표(`"`)로 변경합니다. 예를 들어, `str= ‘스크립트에서 ‘(예제 파일)’의 첫 번째 명령줄’` 코드를 `str= "스크립트에서 "(예제 파일)"의 첫 번째 명령줄"`로 수정해야 합니다.

참고: `str= "[(1,2),(3,4)]"`와 같이 매개변수 유형 명령에는 큰따옴표가 필요합니다.

옵션 2: 문자열 값에 $ 추가

스크립트에 문자열 값을 추가한 경우, 스크립트 구문 오류를 수정하려면 문자열 값 앞에 $ 기호를 추가해야 합니다. 예를 들어, `str= ‘스크립트에서 ‘(예제 파일)’의 첫 번째 명령줄’` 코드를 `str= $’스크립트에서 ‘(예제 파일)’의 첫 번째 명령줄’`로 수정합니다.

참고: 문자열 값에 $를 사용하면 명령줄이 ANSI C 표준에 따라 디코딩되므로 백슬래시 이스케이프 시퀀스를 무시할 수 있습니다. 즉, 문자열 값에 $를 사용하면 명령줄에서 작은따옴표 대신 큰따옴표를 사용하는 것을 피할 수 있습니다.

옵션 3: 탭을 공백으로 변환

스크립트에서 구문 오류를 수정하려면, 명령문 사이의 공백을 탭 대신 공백으로 변경해야 합니다. Cygwin에서 오류가 발생하면, 코드의 탭을 공백으로 변환하여 오류를 수정할 수 있습니다. 예를 들어, 다음과 같은 명령줄이 있습니다.

do echo command1;		echo command2;		echo command3;		echo command4;		done

위의 오류를 수정하려면 명령어를 아래와 같이 다시 작성해야 합니다.

do echo command1; echo command2; echo command3; echo command4; done

옵션 4: 이스케이프 문자 사용

Bash 특수 문자를 사용할 때는 이스케이프 문자를 사용하여 구문 오류를 수정해야 합니다. 괄호 `()`는 Bash에서 특별한 의미를 가지므로, 일반 문자로 처리하기 위해서는 백슬래시 `\`와 같은 이스케이프 문자를 사용해야 합니다. 예를 들어, `str= ‘스크립트에서 ‘(예제 파일)’의 첫 번째 명령줄’` 코드는 이스케이프 문자를 사용하여 터미널에서 오류를 발생시키지 않습니다.

옵션 5: 문자 사이에 공백 사용

셸 스크립트는 스크립트 내의 명령어와 문장을 기본적으로 인식합니다. 셸이 스크립트 내에서 주어진 명령어를 제대로 식별하도록, 문자 사이의 적절한 공백 사용을 보장해야 합니다. 공백은 명령줄에서 두 문자를 구분하는 데 사용됩니다. 예를 들어, `if`와 `[` 사이에 공백이 없으면, 셸이 `if[`를 올바르게 식별하지 못하여 '예기치 않은 토큰' 오류가 발생합니다. 코드를 `if [ $day == "mon" ]`로 수정하면 셸이 명령어를 올바르게 인식하여 오류를 해결할 수 있습니다.

옵션 6: 명령문에 명령 구분 기호 사용

셸 스크립트 내의 다양한 명령어는 터미널이 각 명령어를 개별적으로 식별할 수 있도록 구분되어야 합니다. 리눅스 Bash에서 구문 오류를 수정하려면 명령 구분 기호를 사용해야 합니다. 명령은 세미콜론(;)과 같은 명령 구분 기호로 구분하거나, 새 줄을 입력해야 합니다. 예를 들어, 코드에서 `[ $day == "mon" ]`은 `[ $day == "mon" ];`로 수정해야 합니다. 세미콜론은 명령 사이의 구분 기호로 사용되기 때문에 오류를 수정할 수 있습니다.

옵션 7: 추가 명령문 제거

때로는 중첩된 루프가 많은 경우 코드를 혼합하거나 추가 명령문을 넣을 수 있습니다. 리눅스 Bash에서 '예기치 않은 토큰 `(`' 오류를 수정하려면 명령줄에서 추가 명령문을 제거해야 합니다. 예를 들어, `for…done` 루프나 `if…fi` 구문을 사용할 때 올바른 문법으로 작성해야 합니다. `example.sh` 파일에서 `for` 루프에는 `if` 문에서 사용되는 `then` 구문이 잘못 포함되어 있습니다. 다음 코드와 같이 코드를 수정하면 `then` 문은 불필요하므로 제거하여 '예기치 않은 토큰' 오류를 수정할 수 있습니다.

for VARIABLE in {0..2}; do echo command1; echo command2; echo command3; echo command4; done

옵션 8: 명령문 종료 순서 확인

셸 스크립트에서 중첩되거나 조건적인 구문을 많이 사용하는 경우, 루프가 열린 순서대로 닫히도록 해야 합니다. 새로운 줄 구분자를 사용하여 루프 간의 충돌을 피할 수도 있습니다. 중첩된 루프와 조건문의 종료 순서는 정확해야 하며 변경해서는 안 됩니다. 예를 들어, `while true; do if [ $day == "mon" ]; then echo "mon"; else echo "not mon"; done; fi` 코드에서 루프가 올바른 순서로 닫혀야 합니다. 코드를 다음과 같이 변경하면 문을 닫는 순서가 수정되어 '예기치 않은 토큰' 오류를 해결할 수 있습니다.

while true; do if [ $day == "mon" ]; then echo "mon"; else echo "not mon"; fi; done

방법 2: 코드 재작성

코드를 복사하여 터미널의 새 파일에 붙여넣은 경우, 수동으로 코드를 다시 작성하여 오류를 수정할 수 있습니다. 셸 스크립트에서 형식 오류 없이 코드를 다시 작성하면 코드 오류를 해결할 수 있습니다. Microsoft Word와 같은 텍스트 편집기의 숨겨진 문자 및 서식 문제로 인해 코드를 복사하여 붙여넣는 과정에서 오류가 발생했을 수 있습니다.

방법 3: dos2unix.exe 명령어 사용

유닉스 운영체제에서는 줄 바꿈 문자로 `\n`을 사용하여 다음 줄로 이동합니다. 반면, Windows 운영체제에서는 캐리지 리턴과 줄 바꿈 문자(`\r\n`)를 모두 사용합니다. 따라서 Windows 운영체제에서 작성한 코드를 Cygwin에서 실행하면 '예기치 않은 토큰 `(`' 오류가 발생할 수 있습니다.

오류를 수정하려면, 텍스트 파일 형식 변환기인 `dos2unix.exe` 명령어를 사용하여 캐리지 리턴 문자를 제거해야 합니다. 터미널에 `dos2unix.exe example.sh` 명령어를 입력하면 파일을 유닉스 형식으로 변환할 수 있습니다.

***

이 글에서는 스크립트에서 '예기치 않은 토큰 `(`'과 같은 Bash 구문 오류를 수정하는 기본적인 방법에 대해 설명했습니다. 리눅스 Bash를 사용하는 경우, 여기서 설명한 방법들을 활용하여 '예기치 않은 토큰' 오류를 해결할 수 있습니다. 이 글이 유익하다고 생각하시면, 댓글 섹션에 여러분의 의견과 질문을 남겨주세요.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.