이것이 다른 것과 다른 점은 다음과 같습니다.
- 나는 shebang에서 bash를 호출합니다(sh가 아님).
#! /bin/bash
- 나는 그것을 실행하고있다
./
- 파일 권한이 정확합니다:
755
문제가 있는 줄은 다음과 같습니다.
formattedTIME=`awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' $domPATH/duration.seconds`
내용 $domPATH/duration.seconds
은37603
명령줄에서 실행할 수 있습니다.
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 및 모든 단일 바이트 문자 세트는 백틱 문자입니다.