我想创建一个 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"
我还自始至终引用了扩展 af $count
。有人可能会说这是不必要的,因为我们确切地知道变量将具有什么值,但这仍然是一种很好的做法。参见例如忘记在 bash/POSIX shell 中引用变量的安全隐患
适当的缩进也有助于阅读。
答案2
这是我的版本。
~$ num=1; while ((num<=30)); do sleep 1000 & ((num++)); done
~$ pgrep sleep | wc -l 30
数字可以使用 来自动递增((num++))
。