Bash - 如何在上一个完成后运行命令?

dro*_*ogy 136 shell bash

目前我有一个script.sh包含以下内容的文件:

#!/bin/bash
wget -q http://exemple.com/page1.php;
wget -q http://exemple.com/page2.php;
wget -q http://exemple.com/page3.php;
Run Code Online (Sandbox Code Playgroud)

我想一个一个执行命令,当前一个完成时。我是否以正确的方式做这件事?我以前从未使用过 Linux 并试图搜索它,但没有找到解决方案。

ter*_*don 192

是的,你做对了。Shell 脚本将按顺序运行每个命令,在下一个开始之前等待第一个命令完成。您可以将命令加入;或将它们放在单独的行上:

command1; command2
Run Code Online (Sandbox Code Playgroud)

或者

command1
command2
Run Code Online (Sandbox Code Playgroud)

;如果命令在单独的行上,则不需要。您也可以选择仅当第一个命令成功退出时才运行第二个命令。为此,请加入他们&&

command1 && command2
Run Code Online (Sandbox Code Playgroud)

或者

command1 &&
command2
Run Code Online (Sandbox Code Playgroud)

有关可供您使用的各种控制运算符的更多信息,请参见此处

  • @didierc 这将导致脚本在出现任何错误时退出,并且还会产生大量不必要的进度报告。与使用“&&”链接两个特定命令不同。 (4认同)
  • @polemon 不是真的,不。这是新手用户提出的一个非常简单的问题。我认为添加太多细节没有多大意义。请注意,我什至没有提到`||`。我真的不明白为什么 `wait` 在这里是相关的,它对于运行一个又一个命令的简单任务当然不需要。它只需要对流程进行更细粒度的控制。当然可以随意提交答案,但我宁愿保持简单。 (2认同)
  • @didierc 看到我上面的评论,我在想`set -x`,抱歉。 (2认同)

小智 20

在像这样的重复情况下,我建议使用for 循环

for P in {1..3} ; do wget -q http://exemple.com/page${P}.php ; done
Run Code Online (Sandbox Code Playgroud)

这是适用于命令行的单行版本,但也可以在脚本中使用。将变量嵌入到没有空格的字符串中时,需要在变量名周围使用大括号。

循环不仅按顺序发送请求,而且在需要时更容易调整和重用,而不必担心打字错误。