programing

Bash의 단일 행 동안 루프 구문

topblog 2023. 4. 28. 20:00
반응형

Bash의 단일 행 동안 루프 구문

세미콜론 및/또는 교정기의 올바른 조합을 찾는 데 문제가 있습니다.이 작업을 수행하고 싶지만 명령줄에서 한 줄로 수행할 수 있습니다.

while [ 1 ]
do
    foo
    sleep 2
done
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

의 상태에서 sleep 명령어를 사용할 수도 있습니다.원라이너를 더 깨끗하게 보이게 하는 것은 임호.

while sleep 2; do echo thinking; done

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

while :; do foo; sleep 2; done

세미콜론을 사용하여 문을 구분할 수 있습니다.

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

또한 다음을 사용할 수 있습니다.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

사용.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;

아주 단순한 무한 루프..:)

while true ; do continue ; done

당신의 질문은 다음과 같습니다.

while true; do foo ; sleep 2 ; done

간단한 프로세스 감시 용도watch대신

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

그래서 저는 항상 이렇게 합니다.

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

만약 당신이 어떤 상황 후에 그 동안의 루프를 멈추기를 원한다면, 그리고 당신의foo이 조건이 충족되면 명령이 0이 아닌 값을 반환합니다. 그러면 루프가 다음과 같이 중단됩니다.

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

예를 들어, 다음과 같은 경우foo명령은 항목을 일괄적으로 삭제하는 것이며, 삭제할 항목이 없을 때 1을 반환합니다.

이는 특정 조건이 발생할 때까지 여러 번 명령을 실행해야 하는 사용자 정의 스크립트가 있는 경우에 잘 작동합니다.종료할 스크립트를 작성합니다.1조건이 충족되고 종료될 때0다시 실행해야 하는 시점.

예를 들어, 파이썬 스크립트가 있다고 가정합니다.batch_update.py데이터베이스의 100개 행을 업데이트하고 반환합니다.0업데이트할 내용이 더 있는 경우1이 이상이 없으면,다음 명령을 사용하면 업데이트 사이에 5초 동안 절전 모드로 한 번에 100행을 업데이트할 수 있습니다.

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

사용할 필요도 없습니다.do그리고.done무한 루프의 경우 더 쉽게 사용할 수 있습니다.for대괄호를 두른예:

for ((;;)) { date ; sleep 1 ; }

이 기능은 다음에서 작동합니다.bash그리고.zsh에서 작동하지 않음sh.

(약간의 "감정"과 함께) 두 가지 실질적인 예를 들어보겠습니다.

이렇게 하면 "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

그저 기여하려고 노력하는 것뿐입니다.

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

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

또한 이 루프를 백그라운드에 배치할 수도 있습니다(예: 원격 시스템에서 연결을 끊어야 하는 경우).

nohup bash -c "while true; do aws s3 sync xml s3://bucket-name/xml --profile=s3-profile-name; sleep 3600; done &"

언급URL : https://stackoverflow.com/questions/1289026/syntax-for-a-single-line-while-loop-in-bash

반응형