어쩌면 이것은 멍청한 질문일지도 모르지만 저는 sh 스크립트를 처음 접했고 제 논리가 올바른지 확인하기 위해 약 2시간을 기다려야 했기 때문에 여기에 질문하고 싶었습니다.
특정 파일의 줄 번호를 가져오는 sh 스크립트가 있습니다. 조건이 충족되면 전체 sh 스크립트가 종료/중지되어야 합니다.
if [wc -l "$file_data" -lt 2000]; then
echo "does not meet minimum requirements"
exit -1
exit 0
아니면 을 선택 해야 할지 모르겠습니다 exit 1
.exit -1
답변1
논리는 정확하지만 구문이 올바르지 않습니다.
if [ "$(wc -l <"$file_data")" -lt 2000 ]; then
echo 'Error error' >&2
exit 1
fi
[
]
앞뒤에 각각 공백이 필요합니다 .[
별도의 명령이고]
명령의 마지막 매개변수여야 하므로 공백이 필요합니다 .명령의 출력은 명령 대체를 통해 문자열로 대체될 수 있습니다
$(...)
. 위 테스트에서는 명령 대체를 사용하여 파일의 줄 수를 계산했습니다. 결과는 문자열에 삽입되어 숫자 2000과 비교됩니다. 파일의 데이터를 로 리디렉션합니다wc -l
. 즉, 출력에서 파일 이름을 제거할 필요가 없습니다wc
.종료 상태는 성공 시 0이어야 하고 실패 시 1에서 127 사이의 0이 아닌 정수여야 합니다. 0이 아닌 것 외에 이 숫자는 코드에 의해 할당된 의미 외에는 본질적인 의미가 없습니다. 일부 도구는 다른 숫자를 사용하여 다른 오류 조건을 지정합니다.
curl
("종료 코드" 섹션) 및rsync
("종료 값" 섹션)에 대한 설명서를 참조하세요. 대부분의 도구는1
실패 신호 에만 사용됩니다 .진단 메시지, 오류 등은 표준 오류 스트림으로 출력되어야 합니다. 리디렉션을 통해 이 작업을 수행할 수 있습니다
>&2
. 이렇게 하면 출력에 오류 메시지가 섞이지 않고 진단 메시지에서 스크립트의 일반 출력이 분리됩니다. 같은 이유로 대화형 프롬프트, 질문 등도 표준 오류 스트림으로 출력됩니다.진술은
if
으로 끝납니다fi
.
또한보십시오https://www.shellcheck.net/웹사이트는 가장 기본적인 오류를 찾는 데 도움이 되는 도구를 제공합니다.