shell脚本中等待上一条命令执行结束在执行下一条

参考地址:

https://blog.csdn.net/tiwoo/article/details/51094913

在开发中,我们有时候需要使用 Shell 脚本完成一些简单的操作,但是往往有的操作比较耗时,但是我们又不得不等待它执行完成后才能进行下面的步骤,所以许多朋友往往使用sleep等方法来强制等待操作完成,其实完全没有必要,我们只需要使用一个小小的 tricky 方法就可以实现精准等待操作完成的效果。

Shell 默认提供了获取命令执行输出的方法,即用 ` 号将需要获取输出的操作括起来,并赋值给一个变量,则 Shell 会在等待命令执行完成后把输出内容用于赋值,所以,这就是实现了我们需要的等待效果,并且时间精准性很高。

假设command 1执行需要1s,command 2执行需要视当前资源占用率花费10s~30s不等,command 3执行需要1s,则实现的代码如下:
#!/bin/sh

command 1

output=`command 2`

command 3

 

 

 参考地址:https://blog.csdn.net/attack_city_lion/article/details/102616729?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-102616729-blog-51094913.pc_relevant_multi_platform_featuressortv2dupreplace&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-102616729-blog-51094913.pc_relevant_multi_platform_featuressortv2dupreplace&utm_relevant_index=1

首先了解下背景知识。

命令生效顺序
Linux系统下命令生效的顺序有以下4条:

绝对路径或相对执行的命令;

别名;

Bash的内部命令;

按照$PATH环境变量定义的目录查找顺序搜到的第一个命令。

实际shell脚本编写过程中,总会有这么一个场景,

 

#!/bin/bash
file=command1
command2 $file

下一条命令command2执行所需要的参数或者需要涉及的文件,是由上一条命令command1执行的结果产生的。

而command执行需要的时间可能要1分钟,但是个人实践之后认为shell脚本中的命令都是顺序执行的

这时候就需要我们等待着command1执行完在执行command2。

1 &&

shell1 && shell2 && shell3
2 若有for循环 在循环体之后使用wait sleep

#!/bin/bash

  source ~/.bashrc

  fun(){

  echo "fun is begin.timeNum:$timeNum"

  local timeNum=$1

  sleep $timeNum &



  wait #这个只等待wait前面sleep

  echo "fun is end.timeNum:$timeNum"

  }

3

#!/bin/sh
command 1
output=`command 2`
command 3
4

#!/bin/bash
for ((i=0;i<5;i++))
do
sleep 3;echo a
done

#运行需要15秒。


#!/bin/bash
for ((i=0;i<5;i++))
do
{
sleep 3;echo a
} &
done
wait

#打开5个子进程并行,运行只需要3秒。

 

linux简单实现先并行执行命令执行执行完毕后在执行后面的命令

参考地址:https://blog.csdn.net/themanofcoding/article/details/81663215

例如:有三个脚本:a.sh b.sh c.sh

需求:并行执行完这三个脚本之后,输出helloworld。

并行执行命令,通过&后台运行来实现,之后是等待并行执行完毕,输出helloworld。

sh a.sh &
sh b.sh &
sh c.sh &
wait
echo "helloworld"

posted @ 2022-08-09 16:29  嘻嘻哈哈的人生  阅读(11455)  评论(0编辑  收藏  举报