• 本页内容

33. 用 && 组合多个命令


&&仅当前一个命令成功执行且返回状态为零时才用于执行后续的命令序列。

语法:

command1 && command2 && command3 && ..
  • 如果 command1 成功执行(返回状态为 0),bash 将继续执行 command2。
  • 如果 command1 失败(返回状态非零),bash 不会执行 command2(或 command3 或该行上的任何其他内容)。
  • 如果 command2 成功执行,bash 将执行 command3。
  • 如果 command2 失败,bash 会跳过该行的其余部分。

下面的示例中有 5 个命令,用&&分隔,并且全部执行,因为没有一个失败:

$ ls -ld /etc && x=10 && echo "value of x is: $x" && pwd && echo "finished"
drwxr-xr-x. 86 root root 4096 Aug 6 06:37 /etc
value of x is: 10
/root
finished

以下示例也有 5 个由&&分隔的命令。然而,第二个命令失败了(因为我们在变量赋值中的等号前后给出了空格)。 由于 command2 失败,command3、4 和 5 从未被执行。

$ ls -ld /etc && x = 10 && echo "value of x is: $x" && pwd && echo "finished"
drwxr-xr-x. 86 root root 4096 Apr 6 06:37 /etc
-bash: x: command not found

注意:整个命令序列的返回状态与列表中最后一个失败命令的退出状态完全相同。

您可以在if语句中使用&& ,如下所示。 当所有命令执行成功后,您可以进一步执行if命令体中的一条或多条命令。

在此示例中,if语句中的多个命令由&&分隔:

$ cat and-list1.sh
passwd=/etc/passwd
group=/etc/group

if [ -f $passwd ]                     \
&& x=`wc -l $passwd|awk '{print $1}'` \
&& [ -f $group ]                      \
&& y=`wc -l $group|awk '{print $1}'`  \
&& let total=$x+$y
then
    echo "Total number of lines in $passwd and $group files are: $total"
fi
echo "Finished"

$ ./and-list1.sh
Total number of lines in /etc/passwd and /etc/group files
are: 88
Finished

由于if语句的主体(then部分)中只有一个命令, 因此我们可以完全删除if命令,并使echo语句成为&&链中的最后一个命令。 但是,如果我们在if语句的主体中有更多命令,那么前面显示的形式将是最好的。

下一个示例显示如何使用&&控制所有命令:

$ cat and-list2.sh
passwd=/etc/passwd
group=/etc/group
[ -f $passwd ]                        \
&& x=`wc -l $passwd|awk '{print $1}'` \
&& [ -f $group ]                      \
&& y=`wc -l $group|awk '{print $1}'`  \
&& let total=$x+$y                    \
&& echo "Total number of files in $passwd and $group files are: $total"

$ ./and-list2.sh
Total number of files in /etc/passwd and /etc/group files are: 88

最后 2 个示例中使用的命令是:

  • [ -f $passwd ] - 检查 passwd 文件是否存在
  • x=`wc -l $passwd|awk '{print $1}'` - 计算 passwd 文件中的总行数并将其存储在变量 x 中
  • [ -f $group ] - 检查组文件是否存在
  • y=`wc -l $group|awk '{print $1}'` - 计算组文件中的总行数并将其存储在变量 y 中
  • let total=$x+$y - 将 x 和 y 相加并将结果存储在变量 total 中。

总结一下:要使用test命令[ ],实际上不需要使用if命令; 您可以使用&&来测试结果并控制程序流程。

if转换的一个简单示例是更改以下内容:

if [ "$BACKUP" = "yes" ]
then
    tar cvf home.tar /home
fi
转换为:
[ "$BACKUP" = "yes" ] && tar cvf backup.tar /home

&&的另一个很好的用法如下所示:仅当mkdir成功时才执行cd

mkdir /home/ramesh/test && cd /home/ramesh/test