30개의 수면 프로세스를 생성하는 bash 스크립트 만들기

30개의 수면 프로세스를 생성하는 bash 스크립트 만들기

루프를 sleep 1000 &.사용하여 30개의 프로세스를 생성하고 실행하는 bash 스크립트를 만들고 싶습니다 .while

!/bin/bash

count = 0
while [$count -le 30]

do

count = `sleep 1000& $count +1`
echo $count
done

답변1

귀하의 코드(내 의견 포함):

!/bin/bash
# missing '#' on line above

count = 0
# assignments should not have spaces around '='
# also, start at 1 or use `-lt` below to get 30 instead of 31 processes

while [$count -le 30]
# '[' and ']' *should* have spaces inside

do

count = `sleep 1000& $count +1`
# I can see what you're getting at, but it's wrong

echo $count
done

# (possibly) missing 'wait'

=코드에서 할당 주위에 공백이 있으면 쉘은 해당 행을 " count인수를 취하고 =유틸리티를 실행하십시오 0"로 해석합니다. 이것이 바로 =과제에 공백이 없어야 하는 이유입니다.

[ "$count" -le 30 ]정확히 동일합니다 test "$count" -le 30. 실제로 유틸리티와 동일한 인수를 사용하지만 마지막 인수가 추가로 필요한 [명령입니다( /bin/[일반적으로 속도를 위해 셸에 내장되어 있음) . 과 에 대한 공간 요구 사항 이 여기에 있습니다 .test][]

wait스크립트 끝에 호출이 있어야 합니다. 유틸리티 wait는 모든 백그라운드 작업(호출)이 완료될 때까지 기다립니다 sleep 1000. 그렇지 않은 경우 wait스크립트가 끝날 때 백그라운드에서 실행되는 30개의 프로세스를 시작하게 됩니다. 그러나 그것은 아마도 당신이 원하는 것일 것입니다.

수정된 코드:

#!/bin/bash

count=0

while [ "$count" -lt 30 ]; do
    sleep 1000 &
    count=$(( count + 1 ))
    echo "$count"
done

wait

또는,

#!/bin/bash

for (( count = 0; count < 30; ++count )); do
    sleep 1000 &
    echo "$count"
done

wait

때로는 다음과 같은 것을 보게 될 것입니다.

for count in {0..29}; do
    sleep 1000 &
    echo "$count"
done

wait

...하지만 저는 개인적으로 이러한 유형의 루프를 좋아하지 않습니다. 왜냐하면 루프가 시작되기 전에 쉘이 {0..29}목록으로 확장되어야 하기 때문입니다. 0 1 2 3 4 ... 29나는 이것이 우아하지 않다고 생각하지만 그것은 개인적인 의견입니다.

echo "$count"위의 코드에서 사용했습니다 . 일반적으로 변수 데이터를 출력할 때 printf다음이 더 안전하므로 다음을 사용합니다 .

printf '%d\n' "$count"

예를 들어 참조하십시오.왜 printf가 echo보다 나은가요?

나는 또한 확장자 af를 전체적으로 인용했습니다 $count. 어떤 사람들은 변수가 어떤 값을 갖게 될지 정확히 알고 있기 때문에 이것이 불필요하다고 말할 수도 있지만 여전히 좋은 습관입니다. 예를 들어 참조하십시오.bash/POSIX 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험

적절한 들여쓰기는 읽기에도 도움이 됩니다.

답변2

이것은 내 버전입니다.

~$ num=1; while ((num<=30)); do sleep 1000 & ((num++)); done

~$ pgrep sleep | wc -l 30

를 사용하여 숫자를 자동으로 증가시킬 수 있습니다 ((num++)).

관련 정보