for 루프 조건에 if 문 추가

for 루프 조건에 if 문 추가

이 코드를 최소화하기 위해 for 루프를 만들려고 합니다. 어떤 아이디어가 있습니까?

hello=5
if [[ -n hello ]]; then 
    for ((n=0; n<hello; n++));
    do
        echo "Running: `ps $user | wc -l` instance(s) ...";
    done
else
    while :
    do
        echo "Running: `ps $user  | wc -l` instance(s) ...";
    done
fi

나는 다음과 같은 것을 시도했습니다

for ((n=0;n<hello; [[ -n $hello ]] && n++ || n));

그러나 이것은 작동하지 않는 것 같습니다.

아이디어는 간단합니다. $hello가 존재하면 지정된 반복 횟수만큼 실행하고, 그렇지 않으면 무한히 실행합니다.

답변1

2147483647(2 31 - 1) 또는 999999999999999 와 같이 "충분히 큰" 숫자를 사용하여 "무제한"을 나타내는 것 외에도 -1 또는 0과 같은 값을 사용하여 "무제한"을 나타내는 것이 비교적 일반적입니다.

-1이 "무제한"이므로 아마도 다음과 같은 것을 선택할 것입니다.

#!/bin/bash
count=5
[ -n "$1" ] && count=$1
for ((i=0; count == -1 || i < count; i++)); do
    echo "doing something for the ${i}th time"
    sleep .1
done

또는 제한이 존재하는지 확인하기 위해 별도의 변수를 사용할 수도 있습니다.

has_limit=0
for ((i=0; ! has_limit || i < count; i++)); do
    ...

그러나 물론 사용자는 두 개의 값을 입력해야 하며, 그 중 하나는 다른 하나를 의미 없게 만듭니다.


이것에 관해서는:

for ((n=0;n<hello; [[ -n $hello ]] && n++ || n));

내부는 for (( ... ))산술 컨텍스트이므로 내부에서 임의의 쉘 코드를 실행할 수 없습니다. 위에서 했던 방식으로 할 수 있지만 적어도 그런 테스트를 for (( )).

답변2

count=0

while true; do
    [ -n "$n" ] && [ "$count" -ge "$n" ] && break

    echo 'some string'
    sleep 1

    count=$(( count + 1 ))
done

이는 두 개의 루프를 실행될 while때까지 실행되는 하나의 루프 로 결합합니다 break. n이는 변수가 비어 있지 않고 숫자 값이 변수 값보다 작거나 같은 경우에 발생합니다 count.

설정 되지 n않거나 비어 있으면 루프는 외부에서 종료될 때까지 실행됩니다.

코드는 다음과 같이 단축될 수 있습니다.

count=0

until [ -n "$n" ] && [ "$count" -ge "$n" ]; do
    echo 'some string'
    sleep 1

    count=$(( count + 1 ))
done

두 루프 모두 POSIX와 유사한 셸에서 작동해야 합니다.

관련 정보