我有一个脚本,做的东西与ID作为参数,我想让它接受多个参数,然后复制自己,使每个副本运行与自己的参数从列表。例如,我运行"脚本1"脚本2"脚本3"脚本1"脚本2"脚本2"脚本3"脚本3"脚本2"脚本2"脚本3"脚本3"脚本2"脚本3"脚本3"脚本3"脚本",我希望看到的结果就像我运行"脚本1"脚本2"脚本3"脚本3"脚本"一样。
我可以使用
在脚本中启动一个脚本MyName="${0##*/}"
bash ./$MyName $id
$id基本上是我想放在这个脚本中的参数。我发射了多个;但是,我从脚本中启动的脚本会一个接一个地以原始方式处理,而不是并行处理。我试着在$id后面加上'$',但没有成功。
是否有可能从一个脚本启动一个脚本,使它们在后台作为单独的进程运行,就好像我要运行多个脚本&我从终点站出来?
这是我认为你想要的…在处理单个id的情况下使用一些虚拟示例代码。
如果没有给出参数,它将给出Usage:
输出,如果给出了超过一个参数,它将调用自己作为后台任务,每个参数调用一次,然后等待这些后台任务完成。
如果只给一个参数,它将为您执行工作负载。
更简洁的方法可能是在两个脚本中完成此操作,一个是处理前两种情况的启动器,另一个是处理工作负载的脚本。
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Usage $0 <id1> ..." 1>&2
exit 1
fi
if [ $# -gt 1 ]; then
# Fire up the background jobs
for myid in $*; do
$0 $myid &
done
# Now wait for the background scripts to finish
wait
exit 0
fi
id=$1
echo "PID $$ ($id) - Hello world, on $(date)."
sleep 5
示例运行:
$ ./myscript.sh 10 20 30 40 50; date
PID 8558 (10) - Hello world, on Tue Jun 21 22:22:10 PDT 2022.
PID 8559 (20) - Hello world, on Tue Jun 21 22:22:10 PDT 2022.
PID 8560 (30) - Hello world, on Tue Jun 21 22:22:10 PDT 2022.
PID 8561 (40) - Hello world, on Tue Jun 21 22:22:10 PDT 2022.
PID 8563 (50) - Hello world, on Tue Jun 21 22:22:10 PDT 2022.
Tue Jun 21 22:22:15 PDT 2022
最后的; date
显示初始脚本直到所有子进程完成才返回。