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++))

関連情報