답변:
bash -n scriptname
아마도 명백한주의 사항 : 이것은 구문의 유효성을 검사하지만 bash 스크립트가 경로 ech hello
대신에 없는 명령을 실행하려고하는지 확인하지 않습니다 echo hello
.
set
.
if ["$var" == "string" ]
대신 공간이 부족하여 발생하는 오류를 포착하지 않습니다.if [ "$var" == "string" ]
type [
"[는 내장 쉘입니다." 궁극적으로 test
프로그램에 위임 되지만 닫는 괄호도 기대됩니다. 따라서 이것은 if test"$var"
저자의 의미는 아니지만 구문 적으로 유효합니다 ($ var의 값이 "a"인 경우 "bash : testa : command not found"). 요점은 구문 상으로는 누락 된 공간이 없다는 것입니다.
[
이 경우 빈 문자열$var
로 확장되는 경우에만 Builtin 이 호출됩니다 . 경우 A와 팽창 비어 있지 않은 문자열이 됩니다 연결된 그 문자열과로 해석됩니다 명령 이름 ( 기능 이다 배쉬, 그리고, 그래, 이름) 구문 분명히, 당신 상태로, 의도하지 유효하지만. 셸 대신 키워드 를 사용 하지만을 대신 사용 하면 의도하지 않은 문자열 연결이 여전히 키워드 인식을 무시하기 때문에 동일한 결과를 얻을 수 있습니다. $var
[
[[
[
[[
["$var"
이다 구문 적으로 유효한 명령 이름의 표현; 마찬가지로 토큰 ==
및 "$string"
유효한 명령 인수 입니다. (일반적으로 내장이 [
와 구문 분석 명령 반면, 구문 [[
- 쉘로 키워드 - 다른 구문 분석됩니다.) 쉘 내장은 [
않습니다 하지 위임 은 "에 test
프로그램"(외부 유틸리티) : bash
, dash
, ksh
, zsh
모두가 내장 모두의 버전 [
및test
외부 유틸리티 상대를 호출 하지 않습니다 .
시간은 모든 것을 바꿉니다. 다음은 쉘 스크립트에 대한 온라인 구문 검사를 제공 하는 웹 사이트 입니다.
일반적인 오류를 감지하는 것이 매우 강력하다는 것을 알았습니다.
ShellCheck 는 sh / bash 스크립트를위한 정적 분석 및 보푸라기 도구입니다. 주로 초급 및 중급 구문 오류와 함정을 다루는 데 중점을 둡니다. 쉘은 단순한 오류 메시지 또는 이상한 동작을 제공하지만 코너 케이스가 지연된 오류를 일으킬 수있는 몇 가지 고급 문제에 대해서도보고합니다.
하스켈 소스 코드는 GitHub에서 구할 수 있습니다!
apt-get install shellcheck
trusty-backports
.
또한 추가 검사를 수행하기 위해 작성한 모든 bash 스크립트에서 'u'옵션을 활성화합니다.
set -u
다음 스크립트 'check_init.sh'와 같이 초기화되지 않은 변수의 사용법을보고합니다.
#!/bin/sh
set -u
message=hello
echo $mesage
스크립트 실행 :
$ check_init.sh
다음을보고합니다.
./check_init.sh[4] : 메시지 : 매개 변수가 설정되지 않았습니다.
오타를 잡는 데 매우 유용
set -u
오류 메시지를 받으려면 스크립트를 실행해야하기 때문에이 질문에 실제로 대답하지는 않지만 +1입니다 . bash -n check_init.sh
그 경고 조차 보여
sh -n script-name
이것을 실행하십시오. 스크립트에 구문 오류가 있으면 동일한 오류 메시지를 반환합니다. 오류가 없으면 메시지를 표시하지 않고 나옵니다. 을 사용하여 즉시 확인할 수 있으며 실수없이 성공적으로 확인 echo $?
을 반환 0
합니다.
그것은 나를 위해 잘 작동했습니다. Linux OS Bash Shell에서 실행했습니다.
sh -n
스크립트가 유효한 Bash 스크립트인지 확인하지 못할 것입니다. 잘못된 부정을 줄 수 있습니다. sh
보통 Bash가 아닌 Bourne 쉘 변형입니다. 예를 들어 우분투 리눅스에서는 realpath -e $(command -v sh)
/ bin / dash를 제공합니다.
이 BashSupport 플러그인 에 대한 하게 IntelliJ IDEA 하는 검사 구문.
.sh
Bash 스크립트와 관련된 확장자 또는 다른 확장자로 끝나지 않으면 작동하지 않습니다 . 이는 ERB와 같은 템플릿 도구를 사용하여 스크립트를 생성하는 경우입니다 (그런 다음으로 끝남 .erb
). 수정하려면 youtrack.jetbrains.com/issue/IDEA-79574에 투표하십시오 !
변수 (디렉토리에있는 모든 파일의 유효성 (git pre-commit hook, build lint script)이 변수에 필요하면 "sh -n"또는 "bash -n"명령의 stderr 출력을 포착 할 수 있습니다 (기타 참조). 답변)를 변수에 입력하고이를 기반으로하는 "if / else"
bashErrLines=$(find bin/ -type f -name '*.sh' -exec sh -n {} \; 2>&1 > /dev/null)
if [ "$bashErrLines" != "" ]; then
# at least one sh file in the bin dir has a syntax error
echo $bashErrLines;
exit;
fi
필요에 따라 "bash"로 "sh"변경