ループを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++))
。