sh 루프에서 "do" 뒤에 ";"가 없는 이유는 무엇입니까?

sh 루프에서 "do" 뒤에 ";"가 없는 이유는 무엇입니까?

한 줄에 작성할 때 쉘 루프 뒤에 문자가 없는 이유는 무엇입니까 ;?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뒤에 세미콜론이나 개행 문자가 필요하지 않지만 명령 바로 앞에 나타난다는 점에서 다른 키워드와 일관성이 있는 것으로 보입니다.whileifthendone

다른 옵션( 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과 같이 나타납니다 .IFELSEELIFFI

답변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.

관련 정보