在写shell脚本或是在shell环境里面,经常需要把多条命令前后串起来执行。常见的几种用法是:
* command1 ; command2 ; command3 ; ...
;隔开各条命令,命令串起顺序执行并互相不影响。即使其中某一条命令执行失败,后面的命令也继续执行。
经常在shell里面敲多条命令,懒得一条一条地敲回车,就这么写。
* command1 | command2 | command3 | ...
| 隔开各条命令,|是shell里面的管道操作符号(pipe operator)。前一条命令的结果,作为后一条命令的输入。
管道操作符有时候可以帮助我们省很多事情,如下面的这组命令搜索出所有的目录,在把搜索出来目录的权限设置为777.
find ./ -type d | xargs chmod 777
* 逻辑操作 && 和 ||
&& 和 ||因为是Shell中的“与”和“或”操作,就放在一起说。使用它们最大的特点就是某条命令执行的结果(成功和失败),能够
影响到是否执行后续的命令。
它们的执行规则如下:
command1 && command2 && command3 && ...
从左到右执行,当前面的命令
执行“成功”后才继续执行后面的命令。
command1 || command2 || command3 || ..
从左到右执行,当前面的命令
执行“失败”后才继续执行后面的命令。
命令执行成功是指其返回值等于0。 以date命令为例(之所以选择date,是因为其返回值总是0),下面两条语句是等价的,都会输出"date: successed"
date && echo "date: successed"
date; ret_code=$? ; [ $ret_code = 0 ] && echo "date: successed"
上面的第二条语句取出了date命令的返回值并和0进行比较。当比较的结果为真时候。就接着执行后面的echo语句。
“||" 常见的一种用法是在Makefile里面,当需要进入到不同目录里面进行编译,当其中一个目录中的编译发生
错误的时候,就整个退出:
target:
for subdir in "dir1 dir2 dir3"; do \
make -C $$subdir || exit 1; \
done