Bash에서의 do-while 루프 에뮬레이트
Bash에서 do-while 루프를 에뮬레이트하는 가장 좋은 방법은 무엇입니까?
이 상태를 확인한 후while
루프 상태를 다시 체크합니다만, 중복된 코드입니다.좀 더 깨끗한 방법은 없나요?
내 스크립트의 유사 코드:
while [ current_time <= $cutoff ]; do
check_if_file_present
#do other stuff
done
이거 안 돼check_if_file_present
다음에 기동했을 경우$cutoff
시간이면 할 수 있을 거야
두 가지 간단한 솔루션:
while 루프 전에 코드를 한 번 실행합니다.
actions() { check_if_file_present # Do other stuff } actions #1st execution while [ current_time <= $cutoff ]; do actions # Loop execution done
또는 다음 중 하나를 선택합니다.
while : ; do actions [[ current_time <= $cutoff ]] || break done
루프의 본체를 다음 위치에 배치합니다.while
그리고 시험 전에.의 실제 본체while
루프는 no-op이어야 합니다.
while
check_if_file_present
#do other stuff
(( current_time <= cutoff ))
do
:
done
대장 대신continue
더 읽기 쉽다고 생각하시면요.또한 다음과 같이 반복 사이에만 실행되는 명령어를 삽입할 수도 있습니다(처음 또는 마지막으로 실행한 후에는 삽입할 수 없습니다.echo "Retrying in five seconds"; sleep 5
. 또는 값 사이의 구분 기호를 인쇄합니다.
i=1; while printf '%d' "$((i++))"; (( i <= 4)); do printf ','; done; printf '\n'
당신이 정수를 비교하고 있는 것 같아서 이중 괄호를 사용하도록 테스트를 변경했습니다.이중 대괄호 안쪽에 다음과 같은 비교 연산자가 있습니다.<=
는 어휘적인 것으로, 예를 들어 2와 10을 비교할 때 잘못된 결과를 얻을 수 있습니다.이러한 연산자는 단일 대괄호 안에서 작동하지 않습니다.
이 실장:
- 코드 중복 없음
- 추가 함수() 필요 없음
- 루프의 "while" 섹션에 있는 코드의 반환 값에 의존하지 않습니다.
do=true
while $do || conditions; do
do=false
# your code ...
done
읽기 루프에서도 작동하며 첫 번째 읽기를 건너뜁니다.
do=true
while $do || read foo; do
do=false
# your code ...
echo $foo
done
Bash의 do-while 루프를 에뮬레이트할 수 있습니다.while [[condition]]; do true; done
다음과 같습니다.
while [[ current_time <= $cutoff ]]
check_if_file_present
#do other stuff
do true; done
예를 들면.다음은 bash 스크립트로 ssh 연결을 얻기 위한 구현입니다.
#!/bin/bash
while [[ $STATUS != 0 ]]
ssh-add -l &>/dev/null; STATUS="$?"
if [[ $STATUS == 127 ]]; then echo "ssh not instaled" && exit 0;
elif [[ $STATUS == 2 ]]; then echo "running ssh-agent.." && eval `ssh-agent` > /dev/null;
elif [[ $STATUS == 1 ]]; then echo "get session identity.." && expect $HOME/agent &> /dev/null;
else ssh-add -l && git submodule update --init --recursive --remote --merge && return 0; fi
do true; done
출력은 다음과 같이 순서대로 표시됩니다.
Step #0 - "gcloud": intalling expect..
Step #0 - "gcloud": running ssh-agent..
Step #0 - "gcloud": get session identity..
Step #0 - "gcloud": 4096 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX /builder/home/.ssh/id_rsa (RSA)
Step #0 - "gcloud": Submodule '.google/cloud/compute/home/chetabahana/.docker/compose' (git@github.com:chetabahana/compose) registered for path '.google/cloud/compute/home/chetabahana/.docker/compose'
Step #0 - "gcloud": Cloning into '/workspace/.io/.google/cloud/compute/home/chetabahana/.docker/compose'...
Step #0 - "gcloud": Warning: Permanently added the RSA host key for IP address 'XXX.XX.XXX.XXX' to the list of known hosts.
Step #0 - "gcloud": Submodule path '.google/cloud/compute/home/chetabahana/.docker/compose': checked out '24a28a7a306a671bbc430aa27b83c09cc5f1c62d'
Finished Step #0 - "gcloud"
언급URL : https://stackoverflow.com/questions/16489809/emulating-a-do-while-loop-in-bash
'programing' 카테고리의 다른 글
Go에서 빈 문자열을 테스트하는 가장 좋은 방법은 무엇입니까? (0) | 2023.04.21 |
---|---|
Swift에서 개체의 클래스 이름을 문자열로 가져옵니다. (0) | 2023.04.21 |
의 쿼리 문자열을 해석 및 변경합니다.NET 코어 (0) | 2023.04.21 |
게시하는 동안 웹 앱을 오프라인으로 전환하려면 어떻게 해야 합니까? (0) | 2023.04.21 |
VBA가 If-statement에서 잘못된 분기를 사용 - 심각한 컴파일러 버그? (0) | 2023.04.21 |