단일 행 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 *.jpg및rm *.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.