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