루프를 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++))
.