단일 행 Bash 무한 while 루프에 대한 구문


633

세미콜론 및 / 또는 중괄호의 올바른 조합을 만드는 데 문제가 있습니다. 나는 이것을하고 싶지만 커맨드 라인에서 하나의 라이너로 :

while [ 1 ]
do
    foo
    sleep 2
done

4
줄 바꿈을 세미콜론으로 바꿉니다. for 루프에서도 마찬가지입니다.
Tom

23
@Tom : 항상 작동하지는 않습니다. 완료 후, 세미콜론이 아닌 첫 번째 명령이 있어야합니다
Stefano Borini

답변:


1230
while true; do foo; sleep 2; done

그건 그렇고, 명령 프롬프트에서 여러 줄로 표시하고 (위로 표시) 화살표를 사용하여 기록을 호출하면 정확하게 한 줄로 표시됩니다.

$ while true
> do
>    echo "hello"
>    sleep 2
> done
hello
hello
hello
^C
$ <arrow up> while true; do    echo "hello";    sleep 2; done

2
"명령 프롬프트에 여러 줄로 표시 한 다음 (위로 표시) 화살표를 사용하여 기록을 호출하면 정확하게 한 줄에 표시됩니다." 나를 위해 사실이 아니었다.
Vincent Scheib 님이

@VincentScheib, cmdhistbash를 사용하는 경우 옵션을 확인 하시겠습니까?
Alok Singhal

우수한! Mavericks (Mac OS-X 10.9)에서 완벽하게 작동하며 VPN을 계속 실행할 수 있습니다. 쿠키 오류로 인해 몇 시간 후에 Openconnect 연결이 끊어집니다. 그래서 openconnect 명령을 쉘 스크립트에 넣고 sudo su를 루트로 만들고이 cmd 줄을 사용하십시오. while true; do sh /Users/myuser/bin/vpn ; done
Blisterpeanuts

170

상태에서 수면 명령을 사용할 수도 있습니다. 하나의 라이너를 더 깨끗하게 보이게 만듭니다.

while sleep 2; do echo thinking; done

16
글쎄, 이것은 구문을 변경하는 것 이상을 수행합니다 . 슬립 명령 실행합니다 . 이전 답변에서 명령이 즉시 실행됩니다. 주목할 점이 있습니다.
DanGordon

@DanGordon while echo thinking ; do sleep 2 ; done 물론 [while] 명령이 실패하면 루프가 종료되므로 while echo thinking || true ; do sleep 2 ; done다시 돌아 가야합니다.while true ; ...
Brian Carcich

69

콜론은 항상 "참"입니다 :

while :; do foo; sleep 2; done

15
왜 콜론은 항상 사실입니까?
Jürgen Paul

8
@Pineapple Under the Sea : bash 맨 페이지에서 : (SHELL BUILTIN COMMANDS 섹션에 있음) : [arguments] 효과가 없습니다. 이 명령은 인수를 확장하고 지정된 리디렉션을 수행하는 것 외에는 아무 것도 수행하지 않습니다. 종료 코드 0이 리턴됩니다.
Adrian W

2
이 구문은 다음과 같이 권장됩니다. : 쉘 자체의 일부입니다. 즉 : 쉘 내장 명령입니다.
avner

@analytik 그래서 당신은 그것이 플러스 마이너스라고 말하고 있습니까? ;-)
Brian Carcich

33

세미콜론을 사용하여 명령문을 분리 할 수 ​​있습니다.

$ while [ 1 ]; do foo; sleep 2; done

3
이 답변은 언제, 왜 설명되어 있기 때문에 좋아합니다. (세미콜론)이 필요합니다.
Mr. AndreasGeo

29

until명령 을 사용할 수도 있습니다 .

until ((0)); do foo; sleep 2; done

대조적으로 해당 주 while, until긴 테스트 조건이 0이 아닌 이탈 상태 인만큼 루프 내부의 명령어를 실행할 것이다.


while루프 사용하기 :

while read i; do foo; sleep 2; done < /dev/urandom

for루프 사용하기 :

for ((;;)); do foo; sleep 2; done

다른 방법으로 until:

until [ ]; do foo; sleep 2; done

until ((0)); do foo; sleep 2; done작동하지 않습니다. 그것은 계속 무한합니다.
030

11

매우 간단한 무한 루프 .. :)

while true ; do continue ; done

귀하의 질문에 대해서는 다음과 같습니다.

while true; do foo ; sleep 2 ; done

8

나는 세미콜론을 WHILE 문에만 사용하고 && 연산자는 루프가 두 가지 이상의 작업을 수행하도록하고 싶습니다 ...

그래서 나는 항상 이렇게 이렇게

while true ; do echo Launching Spaceship into orbit && sleep 5s && /usr/bin/launch-mechanism && echo Launching in T-5 && sleep 1s && echo T-4 && sleep 1s && echo T-3 && sleep 1s && echo T-2 && sleep 1s && echo T-1 && sleep 1s && echo liftoff ; done

1
글쎄, &&루프에서 의 사용은 다른 시간과 동일합니다. 첫 번째 경우에만 두 번째 일이 발생 하면 &&다른 것을 사용하십시오 ;. 실제로, 루프의 내용을 짧고 간단하게, 이상적으로는 하나의 명령, 즉 함수 또는 스크립트를 유지하려고합니다.
thecoshman


6

사용 while:

while true; do echo 'while'; sleep 2s; done

for루프 사용하기 :

for ((;;)); do echo 'forloop'; sleep 2; done

을 사용하여 Recursion(위와 약간 다르면 키보드 인터럽트가 멈추지 않습니다)

list(){ echo 'recursion'; sleep 2; list; } && list;

5

foo조건이 충족 된 후 while 루프를 중지 하고이 조건이 충족 될 때 명령이 0이 아닌 값을 반환하면 다음과 같이 루프가 중단 될 수 있습니다.

while foo; do echo 'sleeping...'; sleep 5; done;

예를 들어 foo 명령이 배치에서 항목을 삭제하는 경우 삭제할 항목이 없으면 1을 리턴합니다.

이것은 어떤 조건까지 명령을 여러 번 실행해야하는 사용자 지정 스크립트가있는 경우에 효과적입니다. 1조건이 충족되면 종료 할 스크립트를 작성 하고 종료합니다0 되면 다시 실행해야 할 때 합니다.

예를 들어, batch_update.py데이터베이스에서 100 개의 행 0을 업데이트하고 업데이트 1할 것이 더 있고없는 경우 를 반환 하는 python 스크립트가 있다고 가정하십시오 . 다음 명령을 사용하면 업데이트 사이에 5 초 동안 휴면 상태에서 한 번에 100 행을 업데이트 할 수 있습니다.

while batch_update.py; do echo 'sleeping...'; sleep 5; done;

그리고 어떻게 나가시겠습니까?
AK_

당신은 할 foo코드로 종료 명령을 1사용하면 while 루프가 중단하고자 할 때. 예를 들어 답변을 업데이트했습니다.
Yep_It's_Me

2

두 가지 실제적인 예를들 수 있다면 ( "감정").

"img"폴더에 ".jpg"로 끝나는 모든 파일의 이름이 기록됩니다.

for f in *; do if [ "${f#*.}" == 'jpg' ]; then echo $f; fi; done

삭제합니다 :

for f in *; do if [ "${f#*.}" == 'jpg' ]; then rm -r $f; fi; done

그냥 공헌하려고합니다.


1
@JKnight -이 예를 들어, 당신은하지 않을 것입니다 ls -1 *.jpgrm *.jpg
케빈 Fegan

2
둘 다 무한 루프가 아니며 while 루프가 아닙니다.
Marian

2

당신도 이것을 시도 할 수 있습니다 경고 : 이것은 당신이해서는 안되지만 질문은 무한 루프를 요구하기 때문에 끝이 없습니다 ... 이것이 당신이 그것을 할 수있는 방법입니다.

while [[ 0 -ne 1 ]]; do echo "it's looping";   sleep 2; done

왜 그렇게하겠습니까?
gniourf_gniourf

2
질문을 게시 한 Brian Deacon이 무한 루프처럼 원했기 때문입니다. 고양이에게 피부를 바르는 방법은 여러 가지가 있습니다
grepit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.