创建一个 bash 脚本,创建 30 个睡眠进程

创建一个 bash 脚本,创建 30 个睡眠进程

我想创建一个 bash 脚本,该脚本创建 30 个sleep 1000 &.使用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'

=如果代码中的赋值周围有空格,shell 会将这一行解释为“count使用参数=和运行该实用程序0”。这就是为什么=作业中不应有空格。

[ "$count" -le 30 ]与 完全相同test "$count" -le 30。事实上,[是一个命令(/bin/[,但通常内置于 shell 中以提高速度),它采用与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

...但我个人不喜欢这种类型的循环,因为 shell 必须在循环开始之前扩展{0..29}到列表中。0 1 2 3 4 ... 29我认为这是不优雅的,但这是个人意见。

我已经echo "$count"在上面的代码中使用了。通常在输出变量数据时我会使用,printf因为这通常更安全:

printf '%d\n' "$count"

参见例如为什么 printf 比 echo 更好?

我还自始至终引用了扩展 af $count。有人可能会说这是不必要的,因为我们确切地知道变量将具有什么值,但这仍然是一种很好的做法。参见例如忘记在 bash/POSIX shell 中引用变量的安全隐患

适当的缩进也有助于阅读。

答案2

这是我的版本。

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

~$ pgrep sleep | wc -l 30

数字可以使用 来自动递增((num++))

相关内容