Google의 마크다운 스타일 가이드:
대부분의 명령줄 조각은 터미널에 직접 복사하여 붙여넣기 위한 것이므로 줄 바꿈을 이스케이프 처리하는 것이 가장 좋습니다. 줄 끝에 단일 백슬래시를 사용합니다.
bazel run :target -- --flag --foo=longlonglonglonglongvalue \ --bar=anotherlonglonglonglonglonglonglonglonglonglongvalue
다음 코드 조각을 터미널에 복사하여 붙여넣으면 줄바꿈을 이스케이프 처리하면 작동 오류가 발생하는 이유를 누군가 설명할 수 있습니까? (저는 Mac에서 zsh를 사용하고 있는데 순수 Bash 및/또는 다른 터미널에서도 동일한 일이 발생하는지 확실하지 않습니다. 질문. ?):
이 코드 조각을 복사하여 터미널에 붙여 넣으면 정상적으로 작동합니다.
for (( counter=10; counter>0; counter-- ))
do
echo -n "$counter "
done
printf "\n"
하지만 이것을 복사해서 붙여넣으면 오류가 발생합니다.
for (( counter=10; counter>0; counter-- )) \
do \
echo -n "$counter " \
done \
printf "\n"
答え1
개행 문자( NL
, ^J
)는 줄의 끝을 표시하며 일반적으로 명령을 끝냅니다.
이스케이프된 NL 문자는 공백으로 처리되며 명령이나 줄을 끝내지 않습니다.
foo
bar
두 가지 명령입니다.
foo \
bar
명령이다,
foo bar
答え2
\
그 뒤에 개행 문자가 옵니다.계속하다가독성을 높이기 위해 매우 긴 줄을 여러 줄로 나누는 데 자주 사용됩니다.
쉘은 해당 내용을 읽은 후 삭제합니다.
ec\
ho t\
est
그것을 작성하는 또 다른 방법:
echo test
그리고:
for (( counter=10; counter>0; counter-- )) \
do \
echo -n "$counter " \
done \
printf "\n"
그것을 작성하는 또 다른 방법이 있습니다:
for (( counter=10; counter>0; counter-- )) do echo -n "$counter " done printf "\n"
루프를 닫는 루프가 누락된 것을 echo -n "$counter " done printf "\n"
제외하고는 루프에서 실행됩니다 (다른 하나 는 매개변수임 ).done
done
echo
\<newline>
따라서 매우 긴 줄을 나누기 위해 일부를 삽입하고 싶을 수도 있지만아니요다음과 동일한 <newline>
s(명령 등을 구분하는 데 사용됨)를 교체하고 싶습니다 .\<newline>
아무것도 없다1.
¹ 작은 따옴표 내(또는 $'...'
작은 따옴표를 지원하는 쉘의 경우) 또는 여기에 설명된 대로 따옴표 구분 기호( << "EOF"...EOF
예:
答え3
;
쉘 구문에는 명령을 구분하는 세미콜론( ) 표시가 있습니다 .
대안으로 개행 문자를 사용할 수 있습니다. 즉, 다음과 같이 할 수 있습니다.
command ; command
아니면 이거:
command
command
셸의 일부 구문 구조는 루프와 같은 여러 명령으로 구성됩니다.
while test-command1; test-comand2 ; do command1; command2; command3; done
구문상으로 이것은 6개의 명령입니다. while
루프를 제어하는 테스트 명령 시퀀스의 시작을 표시하는 명령입니다. 그런 다음 do
루프 본문의 시작을 표시하는 명령이 옵니다 . done
끝을 알리는 마지막 명령입니다.
여러 줄에 걸쳐 쓸 때 세미콜론은 선택 사항이 됩니다.
while test-command-1
test-command-2
do command1
command2
command3
done
이제 백슬래시 개행 시퀀스(종종 줄 연속이라고 함)는 여러 물리적 줄을 단일 논리적 줄로 변환합니다. Awk 언어, Make 언어, C 언어의 전처리 기능에도 비슷한 줄 연속 기능이 있습니다.
쉘 스크립트를 연속된 줄이 있는 여러 개의 물리적 줄로 나누면 인터프리터는 한 줄만 봅니다. 따라서 세미콜론이 필요합니다.
잘못된:
while test-command-1 \
test-command-2 \
do command1 \
command2 \
command3 \
done
옳은:
while test-command-1 ; \
test-command-2 ; \
do command1 ; \
command2 ; \
command3 ; \
done
에서 이런 일이 발생하는 것을 흔히 볼 수 있습니다 Makefile
. Make에서 빌드 레시피의 각 줄은 별도의 셸 인스턴스에서 실행되는 별도의 셸 스크립트입니다. 따라서 각 스크립트는 make 구문의 단일 논리적 행에 맞아야 합니다. 줄 연속은 복잡한 쉘 스크립트를 여러 개의 물리적 줄로 나누는 데 사용되므로 세미콜론이 필요합니다.