“while :;”은 무슨 뜻입니까?


27

나는 while루프가 무엇인지 안다 . 그러나 나는 그것이 작동하는 것을 보았습니다.

while [condition]
while ![condition]
while TRUE (infinite loop)

이후의 진술 whileTRUE또는 중 하나 여야합니다 FALSE.

라는 쉘 내장 명령이 :있습니다. 그것은 아무것도하지 않는 더미 명령으로 설명되어 있지만 TRUE또는 될 수 있더라도 여기에서 동일한 지 여부는 알 수 없습니다 FALSE. 어쩌면 그것은 다른 것이지만 무엇입니까?


4
명령 :은 아무것도 수행 하지 않고 항상 리턴 코드 0으로 종료됩니다. 따라서 while true시스템에 true실행 파일 이 있다고 가정합니다 .
John1024

@ John1024 예를 들어 읽기 전용 변수에 값을 할당하여 인수를 평가할 때 오류가 발생하지 않으면 0을 반환합니다.
Kusalananda

3
@Kusalananda 그렇습니다. :명령이 실행되지 않으면 0을 반환하지 않습니다.하지만 제 생각에는 지나치게 비관적입니다.
hvd

답변:


50

구문은 다음과 같습니다.

while
  first list of commands
do
  second list of commands
done

첫 번째 명령 목록 (해당 목록의 마지막 실행)이 성공하면 루프에서 두 번째 명령 목록을 실행합니다.

그에서 명령의 첫 번째 목록 , 당신은 사용할 수있는 [테스트의 다양한 종류를 수행하는 명령을하거나 사용할 수 있습니다 :아무것도 반환 성공, 또는 다른 명령을하지 않습니다 널 명령을 사용합니다.

while :; do cmd; done

실행 cmd을 통해 영원히 같은 이상과 :항상 성공을 반환합니다. 그것은 영원한 고리입니다. true명령을보다 읽기 쉽게하기 위해 대신 사용할 수 있습니다 .

while true; do cmd; done

사람들 은 항상 오래 전부터했던 :것처럼 선호 :했지만 true(오래 전에는 대부분의 껍질에 true내장되어 있습니다) ¹.

다른 변형이 나타날 수 있습니다.

while [ 1 ];  do cmd; done

위에서 우리는 ["1"문자열이 비어 있지 않은지 테스트하기 위해 명령을 호출하고 있습니다 (따라서 항상 참).

while ((1)); do cmd; done

Korn / bash / zsh ((...))구문을 사용하여 while(1) { ...; }C 를 모방

이상 뒤얽힌 사람이 좋아 until false; do cmd; done, until ! true...

그것들은 때때로 다음과 같이 별칭이 지정됩니다 :

alias forever='while :; do'

따라서 다음과 같은 작업을 수행 할 수 있습니다.

forever cmd; done

조건이 명령 목록 이라는 것을 아는 사람은 거의 없습니다 . 예를 들어 사람들이 다음과 같이 쓰는 것을 볼 수 있습니다.

while :; do
  cmd1
  cmd2 || break
  cmd3
done

그들이 쓸 수있을 때 :

while
  cmd1
  cmd2
do
  cmd3
done

명령 목록과 같은 작업을 자주 수행하려는 경우 목록이 되는 것이 합리적입니다 while cmd1 && cmd2; do...; done.

어떤 경우, 노트에 [다른 같은 명령이다, 그것은 전적으로 사용할 수 없습니다 (그것은 Bourne의이 같은 쉘 현대에 내장 비록) if/ while/ until조건 목록 및 그 상태 목록이 없습니다 다른 명령보다 그 명령을 더 많이 사용합니다.


¹ :는 또한 더 짧으며 인수를받습니다 (무시) 인수를 전달하면 true또는 동작 false이 지정되지 않은 상태입니다. 예를 들어 다음과 같이 할 수 있습니다.

while : you wait; do
  something
done

그러나 다음의 동작은 다음과 같습니다.

until false is true; do
  something
done

지정되지 않았습니다 (대부분의 쉘 / false구현 에서 작동하지만 ).


12

while :무한 루프입니다. :아무것도하지 않습니다 (성공적으로).

따라서 쉘이 아무 것도하지 않고 영원히 멈 추길 원한다면 다음과 같이 쓸 수 있습니다.

while :
do
    :
done

또는 줄 ;바꿈 대신 한 줄로 :while :; do :; done

while :일반적으로 특별한 조건을 첨부하지 않고 무언가를 반복적으로 수행하려는 경우에 사용됩니다. 루프 내에서 continue, break문을 사용 하여 루프를 제어하거나 do ... while컨스 트럭 트처럼 루프의 끝으로 조건을 이동할 수 있습니다 .


12

그러나 이후의 명령문은 TRUE 또는 FALSE 여야합니다.

아니오, 조건 부분의 명령은 모든 명령 (*) 일 수 있습니다 . 모든 셸 명령에는 반환 값이 있으며 while루프 ( if조건부)는 모두 0의 반환 값을 "true"로, 다른 모든 값은 "false"를 갖습니다. (* 또는 여러 명령의 목록, 마지막 명령은 중요합니다)

에 관해서는 :, 배쉬 설명서는 그것의 반환 상태가 무엇인지 명확하게 알려줍니다 :

: [arguments]
인수를 확장하고 리디렉션을 수행하는 것 외에는 아무것도하지 마십시오. 반환 상태는 0입니다.

help내장은 더욱 분명하다 :

 $ help :
 [...]
 No effect; the command does nothing
 Exit Status:
 Always succeeds.

s/any command/any sequence of commands/Stéphane이 명확하게 밝힙니다.
Toby Speight
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.