한 줄에 작성할 때 쉘 루프 뒤에 문자가 없는 이유는 무엇입니까 ;
?do
그게 내 뜻이야. 여러 줄에 걸쳐 작성하면 for
루프는 다음과 같습니다.
$ for i in $(jot 2)
> do
> echo $i
> done
한 줄에:
$ for i in $(jot 2); do echo $i; done
모든 접힌 선이 ;
그 뒤에 나타납니다.와는 별개로이 do
줄에 가 포함되어 있으면 ;
오류입니다. 아마도 나보다 훨씬 똑똑한 누군가는 이것이 옳은 일이라고 생각하지만, 나는 왜 그런지 모르겠습니다. 이것은 나에게 일관성이 없는 것 같습니다.
루프에도 마찬가지입니다 while
.
$ while something
> do
> anotherthing
> done
$ while something; do anotherthing; done
답변1
이것이 명령의 구문입니다. 바라보다복합 명령
for name [ [in [words …] ] ; ] do commands; done
주의: do commands
대부분의 사람들은 쉽게 읽을 수 있도록 do
및 를 commands
별도의 줄에 표시하지만 필수는 아닙니다. 다음과 같이 작성할 수 있습니다.
for i in thing
do something
done
나는 이 질문이 특히 쉘에 관한 것이라는 것을 알고 있으며 bash 매뉴얼에 연결했습니다. 쉘 매뉴얼에는 이런 내용이 적혀 있지 않지만, 쉘에는 이렇게 적혀 있습니다.Stephen Byrne이 작성한 기사바이트 매거진의 경우.
스티븐은 이렇게 말했습니다.
ㅏ명령 목록
;
개행 문자(세미콜론)로 구분되거나 끝나는 하나 이상의 간단한 명령 시퀀스입니다. 또한 다음과 같은 예약어는하다그리고완벽한일반적으로 개행 문자 또는;
...이 앞에옵니다. 명령 목록은 다음과 같습니다.하다처형되다.
답변2
while
이 구문의 원래 이유가 무엇인지는 모르지만 루프가 조건부 부분에서 여러 명령을 받아들일 수 있다는 사실을 고려해 보겠습니다.
while a=$(somecmd);
[ -n "$a" ];
do
echo "$a"
done
여기서 do
조건부 부분과 루프 본문을 구별하기 위해 키워드를 사용해야 합니다. and (and ) 와 같은 키워드는 do
뒤에 세미콜론이나 개행 문자가 필요하지 않지만 명령 바로 앞에 나타난다는 점에서 다른 키워드와 일관성이 있는 것으로 보입니다.while
if
then
done
다른 옵션( if
및 로 일반화 while
)은 약간 보기 흉해 보입니다. 예를 들어 다음과 같이 작성해야 합니다.
if; [ -n "$a" ]; then
some command here
fi
루프의 구문은 for
매우 유사합니다.
답변3
쉘 구문은 접두사 기반입니다. 특수 키워드로 소개된 절이 있습니다. 특정 용어는 결합되어야 합니다.
루프 while
는 하나 이상의 테스트 명령으로 구성됩니다.
test ; test ; test ; ...
하나 이상의 본문 명령을 통해:
body ; body ; body ; ...
뭔가가 쉘에게 while 루프를 시작하라고 알려줘야 합니다. 이 단어의 목적은 다음과 같습니다 while
.
while test ; test ; test ; ...
그런데 상황이 모호해집니다. 텍스트를 시작하는 명령은 무엇입니까? 이를 나타내기 위한 무언가가 있어야 하며 그것이 바로 do
접두사가 하는 일입니다.
do body ; body ; body ; ...
마지막으로, 마지막 본문을 보았다는 것을 나타내는 것이 있어야 합니다. 특별한 키워드가 done
이를 수행합니다.
이러한 셸 키워드는 같은 줄에 있더라도 세미콜론으로 구분할 필요가 없습니다. 예를 들어 여러 중첩 루프를 닫으면 done done done ...
.
... test ; body ...
반대로 같은 줄에 있으면 세미콜론이 그 사이에 옵니다. 세미콜론은 종결자로 이해됩니다: 에 속합니다 test
. 따라서 do
키워드 사이에 키워드가 삽입되면 키워드는 세미콜론과 사이에 있어야 합니다 body
. 세미콜론 반대편에 있으면 test
명령 사이에 배치되지 않고 명령 구문에 잘못 포함됩니다.
쉘 구문은 원래 Stephen Bourne이 설계했으며 다음에서 영감을 받았습니다.알골. Bourne은 Algol을 너무 좋아해서 C를 Algol처럼 보이게 만들기 위해 쉘 소스 코드에 많은 C 매크로를 사용했습니다. 당신은 할 수Unix 버전 7에서 1979년 쉘 소스 코드 찾아보기. 매크로는 에 있으며 mac.h
어디에서나 사용됩니다. 예를 들어, 명령문은 다음 if
과 같이 나타납니다 .IF
ELSE
ELIF
FI
답변4
짧은 대답은 다음과 같습니다.POSIX 쉘 구문. do
와 사이의 모든 내용은 done
일련의 명령문으로 처리되며 while은 ;
시퀀스 구분 기호입니다.
for_clause : For name do_group
| For name sequential_sep do_group
| For name linebreak in sequential_sep do_group
| For name linebreak in wordlist sequential_sep do_group
do_group : Do compound_list Done
sequential_sep : ';' linebreak
| newline_list
또한 ;
표준에서는 이를 명시적으로 명시하고 필요한 경우 sequential_sep
뒤에 포함합니다 Do
.