Makefile 규칙의 산술 연산

Makefile 규칙의 산술 연산

아래 설명된 대로 bash 루프 내에서 산술 연산을 수행해야 합니다.

CYCLE?=3
COUNT=1

download_when_ready: ## Will try the download operations many times till it succeeds or it reaches 10 tries
    while ! composer update $(bundle) 2> /dev/null && [[ $(COUNT) -lt 10 ]]; \
    do \
        COUNT=$$(( $(COUNT)+1 )); \
        SLEEP=$$(( ($(COUNT) / $(CYCLE)) + ($(COUNT) % $(CYCLE)) )); \
        echo "count $(COUNT)"; \
        echo "cycle $(CYCLE)"; \
        echo "sleep $(SLEEP)"; \
        sleep $(SLEEP); \
    done

이것은 결코 멈추지 않으며 다음을 제공합니다.

count 0
cycle 4
sleep 0

count 0
cycle 4
sleep 0

....

count 0
cycle 4
sleep 0

보시다시피 변수에는 초기 값이 있으며 절대 변경되지 않습니다!

고쳐 쓰다

PRETTY_NAME="SUSE Linux 엔터프라이즈 서버 11 SP4"

$$c그러나 다음 코드에서는 while 루프 앞과 내부에 값을 비워 둡니다.

CYCLE?=3
COUNT=1

download_when_ready: ## Will try the download operations many times till it succeeds or it reaches 10 tries
    @c=$(COUNT);
    @echo $$c;
    while ! composer update $(bundle) 2> /dev/null && [[ $(COUNT) -lt 10 ]]; \
    do \
        echo "$$c"; \
    done

답변1

고쳐 쓰다

감사해요@Kusalananda 댓글, 나는 생각했다.

나는 사용했다초기값으로 변수변하기 쉬운

CYCLE?=3
COUNT=1

download_when_ready: ## Will try the download operations many times till it succeeds or it reaches 10 tries
    while ! composer update $(bundle) 2> /dev/null && [ "$$c" -lt 10 ]; \
    do \
        c=$$(( $${c:-$(COUNT)}+1 )); \
        s=$$(( ($$c / $(CYCLE)) + ($$c % $(CYCLE)) )); \
        echo "count $$c"; \
        echo "cycle $(CYCLE)"; \
        echo "sleep $$s"; \
        sleep $$s; \
    done

이것은 실제로 작동합니다!

count 1
cycle 4
sleep 1
count 2
cycle 4
sleep 2
count 3
cycle 4
sleep 3
count 4

감사해요@쿠살라난다&@stefanchazeras

관련 정보