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
'programing' 카테고리의 다른 글
Eclipse 콘솔 크기 조정 (0) | 2023.04.28 |
---|---|
sql을 사용하여 날짜 필드에서 월별로 그룹화하는 방법 (0) | 2023.04.28 |
부울 및 두 개의 가시성 변환기를 사용하는 방법 (0) | 2023.04.28 |
Xcode 6 이상에서 카테고리를 만들려면 어떻게 해야 합니까? (0) | 2023.04.28 |
스크립트 자체 내에서 Bash 스크립트가 있는 디렉토리를 가져오려면 어떻게 해야 합니까? (0) | 2023.04.28 |