현재 700줄이 넘는 bash 스크립트가 있습니다. 특히 긴 편집 작업을 마친 후 다음과 같은 오류가 발생합니다.
./run_me.sh: line 693: unexpected EOF while looking for matching `''
./run_me.sh: line 702: syntax error: unexpected end of file
그러나 693행에는 아무런 문제가 없습니다. 위의 인용문도 없습니다.
나는 running 을 시도했고 bash -x run_me.sh
마지막 줄이 실행되는 것을 볼 수 있지만 그 줄에도 아무런 문제가 없습니다(그리고 그 줄과 693 사이의 코드가 실제로 대부분의 코드입니다).
코드 전체를 주석 처리할 수 있지만 그렇게 하면 EOF 오류보다는 함수 누락 등으로 인한 오류가 나타날 가능성이 더 높습니다.
그렇다면 행 번호가 잘못 보고된 경우 누락된 따옴표를 어떻게 찾을 수 있습니까?
(Bash의 줄 번호가 왜 그렇게 멀리 보고됩니까?)
편집하다
그런데, 나는 (스트립에 주석을 달면서) 내 특정 오류를 발견했습니다. 이 오류는 }
오류 메시지가 나타내는 줄 근처에 전혀 없는 임의의 줄 번호에서 변수 확장으로 인해 실제로 손실되었습니다. 여기서는 인용 기반 구문 강조 표시가 도움이 되지 않습니다. 예를 들어 "${MY_ARRAY[@]"
(이어야 함) 에 누락된 중괄호가 있습니다 "${MY_ARRAY[@]}"
.
답변1
로우테크 접근방식은
tr -cd "'\n" < run_me.sh | awk 'length%2==1 {print NR, $0}'
tr
작은따옴표와 개행 문자를 제외한 모든 문자를 제거하고 awk
홀수 문자(예: 일치하지 않는 따옴표)가 있는 줄을 식별합니다. 개별적으로 확인하세요. 유효한 문자열이 표시 "That's not a bug!"
됩니다.
문제가 강조되지 않으면 tr -cd '"\n'
(일치하지 않는 큰따옴표 찾기)를 사용하여 다시 시도하십시오. 다음으로 tr
Allow ()
, []
및 Final {}
Pass를 확장합니다. 이 시점에서 출력을 수동으로 검사하는 것은 덜 효율적입니다. 반면 (
및 일반적으로 같은 줄에서 일치하지만 따옴표와 대괄호는 거의 항상 일치하지만 )
그렇지 않습니다. (그러나 불일치를 찾으면 대신 입력하는 OP의 실제 문제가 드러납니다.){
}
{
}
"${MY_ARRAY[@]"
"${MY_ARRAY[@]}"
문제의 범위를 중괄호 불일치로 좁힌 경우, 특히 파일에서 범위를 좁힌 경우 계획 B로 이동하세요. vim
(또는 ) 에서 vi
파일을 엽니다 . {
오류가 발생했다고 생각하기 전에 해당 문자 로 이동하여 를 입력하세요 %
. 커서가 시작한 위치와 일치한다고 }
생각되는 위치로 이동하면 {
다음 위치로 이동하여 {
반복합니다. 시작한 위치 }
와 일치하지 않는 위치 로 점프하면 {
두 중괄호 사이에 오류가 발생합니다. 움직이지 않는다면 현재 위치와 파일 끝 사이에 오류가 발생한 것입니다. 크게 하다.
이 접근 방식은 C, C++ 및 Java(컴파일러가 충분하지 않은 경우)와 같은 언어의 프로그램 파일에 약간 더 적합할 수 있지만 쉘 스크립트에는 꽤 잘 작동합니다.
답변2
다음과 같은 외부 린팅 도구주택 검사문제를 감지할 수 있으며 bash
자체보다 더 나은 메시지와 위치를 가질 수 있습니다.
echo
대부분이 중간에 가 있는 명령문인 프로그램 의 경우 ShellCheck는 인용된 문자열을 구문 분석할 수 없음을 알려줍니다. "${MY_ARRAY[1]"
심지어 캐릭터의 문제를 비난하며 $
매개변수 확장에 문제가 있음을 시사하기도 했다.
ShellCheck는 Vim, Emacs, SublimeText 및 Atom과 함께 작동합니다.
답변3
가장 쉬운 방법은? 사용 중인 셸을 인식하는 구문 색상 지정 기능이 있는 편집기를 사용하고 육안 검사를 수행하세요. 문자열 색상이 보이면 따옴표가 누락된 것입니다. 거의 모든 괜찮은 프로그래밍 편집기에는 구문 색상 지정이 있습니다.
구문 색상 지정이 때때로 잘못될 수 있지만 이는 일반적으로 프로그램이 너무 복잡하고 사람도 실수를 할 수 있다는 신호입니다.
"
쉘 프로그래밍의 경우 where , '
및 에 대해 쉽게 구별할 수 있는 글꼴을 사용하십시오 . `
실수로 ASCII 따옴표처럼 보이는 비ASCII 문자를 사용했는지 확인하세요 ‘’“”
.
답변4
나는 G-Man의 저급 기술 솔루션을 사용하여 2000개 이상의 라인 bash 스크립트에서 큰 문제를 해결했습니다.
방금 G-Man의 답변이 작은 따옴표에 대해 하는 것처럼 홀수 개의 큰 따옴표에 대해 동일한 작업을 수행하는 다음 줄을 추가했습니다.
tr -cd "\"\n" < my_script.sh | awk 'length%2==1 {print NR, $0}'
그건 그렇고, shellcheck.net은 매우 훌륭하며 모든 좋은 스크립트는 이를 거쳐야 합니다.