예기치 않은 마커 "(" 근처에 또 다른 구문 오류가 있습니다. [닫음]

예기치 않은 마커 "(" 근처에 또 다른 구문 오류가 있습니다. [닫음]

이것이 다른 것과 다른 점은 다음과 같습니다.

  1. 나는 shebang에서 bash를 호출합니다(sh가 아님).#! /bin/bash
  2. 나는 그것을 실행하고있다./
  3. 파일 권한이 정확합니다:755

문제가 있는 줄은 다음과 같습니다.

 formattedTIME=`awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' $domPATH/duration.seconds`

내용 $domPATH/duration.seconds37603

명령줄에서 실행할 수 있습니다.

formattedTIME=`awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' duration.seconds`

Duration: 10h 26m내 결과를 얻으면echo $formattedTIME

그러나 스크립트에서 실행하면 다음과 같은 결과가 발생합니다.

./time.sh: line 42: syntax error near unexpected token `('
./time.sh: line 42: `    formattedTIME=`awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' $domPATH/duration.seconds`'

추가 정보: 이것은 Jessie를 실행하는 Raspberry Pi 2에 있습니다.

업데이트: 온라인 오류 8:

echo 'Cc: [email protected],[email protected],[email protected],[email protected]'' >> $domPATH/arrive.email

답변1

명령이 스크립트에서는 올바르게 구문 분석되지 않지만 개별적으로 실행하면 제대로 작동하는 이유에 대한 몇 가지 일반적인 추세는 다음과 같습니다.

오류의 원인은 다른 곳에 있습니다.

쉘은 예상하지 못한 첫 번째 항목에 대해 오류를 보고합니다. 여기서는 하나가 필요하지 않지만 (인용된 문자열 안에 있는 것으로 보입니다. 한 가지 가능한 설명은 다음과 같이 첫 번째 문자열이 '실제로 새 인용문을 여는 대신 닫히지 않은 이전 인용문을 닫기 때문에 인용된 문자열에 있지 않다는 것입니다 .'...'

echo It's a bug
formattedTIME=`awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' $domPATH/duration.seconds

실제로는 다음과 같습니다.

echo It'quoted-string'{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}'...

위에 인용되지 않은 내용은 (셸에서 예상치 못한 것입니다.

제대로 닫히지 않거나 형식이 잘못된 구조에서는 비슷한 문제가 발생 fi합니다 then.

백틱

백틱을 사용하면 안됩니다. $(...)사용되어야한다.

백틱 내에서는 \다르게 처리됩니다.

echo "`
  echo It\\\'s OK
`"

아니요. 그 자체로 는 echo It\\\'s OK괜찮지만 내부 백틱으로 인해 처음 두 개의 백슬래시가 하나가 되므로 결국 echo It\\'OK.

현대 형태에는 $(...)이러한 문제가 없습니다.

별명

별칭은 매크로와 약간 유사하며 확장은 코드에 의해 다시 해석됩니다.

그림:

alias foo="echo '"
...
foo bar
echo 'baz('

foo별칭 정의 에서 문제를 숨길 수 있습니다 .

다음과 같은 좀 더 미묘한 것들도 있습니다:

alias foo='a;b'
cmd | foo

이로 인해 구문 오류가 발생하지는 않지만 예기치 않은 방식으로 구문 분석이 완료됩니다.

별칭보다 함수가 더 적합한 경우가 많습니다.

현지화

특정 바이트 시퀀스는 로케일에 따라 다르게 해석될 수 있습니다.

예를 들어, 0xa0 바이트는 ISO-8859-1 문자 집합에서 줄 바꿈하지 않는 공백입니다. Solaris에서 이 문자는 공백이며 bash모든 공백은 구분 기호로 처리됩니다(현재는 단일 바이트 문자에만 해당).

0xa0 바이트는 예를 들어 여러 UTF-8 문자의 일부이기도 합니다 à. 예를 들어 스크립트에는 다음이 포함되어 있습니다.

var=àdo

( àUTF-8로 작성됨)은 ISO-8859-1 로케일을 사용하여 Solaris에서 실행될 때 작동이 중지됩니다. 왜냐하면 문자의 첫 번째 바이트는 이기 var=X do때문 입니다 .Xà

또는 다음을 찾을 수도 있습니다.

echo ε

로케일 외부에 있는 경우 εBIG5-HKSCS 문자 세트로 작성된 문자는 실제로 0xa3 0x60으로 인코딩되므로 작동이 중지됩니다. zh_HK.big5hkscs여기서 εASCII의 0x60 및 모든 단일 바이트 문자 세트는 백틱 문자입니다.

관련 정보