Bash 스크립트 오류: 예상치 못한 표시 '(' 근처에 구문 오류가 있습니다.

Bash 스크립트 오류: 예상치 못한 표시 '(' 근처에 구문 오류가 있습니다.

명령을 여러 번 실행하고 싶지만 다른 매개변수를 전달하고 싶기 때문에 이를 수행하기 위해 다음 쉘 스크립트를 작성했습니다.

#!/bin/bash                                                                                                                                                                                                   
for i in {4..6}
do
    for j in {0..10}
    do
        for k in {0..2}
        do
            root -b -l -q fitInvMass.C+($i,$j,$k)
        done
    done
done

그러나 이로 인해 다음과 같은 오류가 발생합니다.

fit.sh: line 8: syntax error near unexpected token `('
fit.sh: line 8: `       root -b -l -q fitInvMass.C+($i,$j,$k)'

답변1

괄호는 함수 정의, 명령 및 프로세스 대체, 배열 할당, 산술 표현식, 하위 쉘 등과 같은 다양한 연산자 및 구조에 사용되는 쉘 구문의 특수 문자입니다. 리터럴 대괄호가 필요한 경우 따옴표로 묶어야 합니다.

root -b -l -q "fitInvMass.C+($i,$j,$k)"

큰따옴표를 사용하면 문자열의 변수가 확장되고 fitInvMass.C+($i,$j,$k)괄호가 쉘 코드로 해석되지 않습니다.


일반적인 권장 사항은 ShellCheck(https://www.shellcheck.net) 쉘 코드를 테스트합니다. 따옴표 누락과 같은 문제를 지적하는 데 유용합니다.

그러나 이 경우 ShellCheck는 3개의 변수 확장을 fitInvMass.C+($i,$j,$k)인용해야 함을 올바르게 나타내지만 괄호도 인용해야 한다는 것을 발견하지 못합니다. 이는 다음 수정된 줄을 기꺼이 받아들인다는 것을 의미합니다.

root -b -l -q fitInvMass.C+("$i","$j","$k")

(또는 변수가 인용되었지만 괄호는 인용되지 않은 변형입니다.)

그러나 여전히 실행에 실패하고 동일한 진단 오류 메시지가 표시됩니다. ShellCheck가 왜 불평하지 않습니까?

+(...)셸의 확장된 와일드카드 구문의 유효한 부분인 확장된 와일드카드 패턴입니다 . 불행하게도 ShellCheck는 패턴이 유효하려면 쉘 옵션을 활성화해야 한다는 점을 bash무시하고 어쨌든 이를 허용하는 것 같습니다 . extglob이것은 아마도 ShellCheck의 버그일 것입니다.

관련 정보