명령을 여러 번 실행하고 싶지만 다른 매개변수를 전달하고 싶기 때문에 이를 수행하기 위해 다음 쉘 스크립트를 작성했습니다.
#!/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의 버그일 것입니다.