이 코드를 최소화하기 위해 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와 유사한 셸에서 작동해야 합니다.