条件执行命令列表
如何使用命令列表的条件执行
任何内置命令,表达式或函数,以及任何外部命令或脚本都可以使用 &&
(和) 和||
(或) 运算符有条件地执行。
例如,如果 cd
命令成功,则仅打印当前目录。
cd my_directory && pwd
同样,如果 cd
命令失败,这将退出,防止灾难:
cd my_directory || exit
rm -rf *
当以这种方式组合多个语句时,重要的是要记住(与许多 C 风格的语言不同) 这些运算符没有优先权并且是左关联的 。
因此,此声明将按预期工作……
cd my_directory && pwd || echo "No such directory"
- 如果
cd
成功,则执行&& pwd
并打印当前工作目录名称。除非pwd
失败(罕见),否则|| echo ...
将不会被执行。 - 如果
cd
失败,将跳过&& pwd
并运行|| echo ...
。
但这不会(如果你想到的话)……
cd my_directory && ls || echo "No such directory"
- 如果
cd
失败,则跳过&& ls
并执行|| echo ...
。 - 如果
cd
成功,则执行&& ls
。-
如果
ls
成功,则忽略|| echo ...
。 (到现在为止还挺好) -
但是……如果
ls
失败,|| echo ...
也将被执行。它是
ls
,而不是cd
,这是前一个命令。
-
为什么使用命令列表的条件执行
条件执行比 if...then
更快,但它的主要优点是允许函数和脚本提前退出或短路。
与像 C
这样的许多语言不同,其中内存被明确地分配给结构和变量等(因此必须被释放),bash
处理这个问题。在大多数情况下,我们不必在离开功能之前清理任何东西。return
语句将释放函数本地的所有内容以及堆栈返回地址处的拾取执行。
尽快从函数返回或退出脚本可以通过避免不必要的代码执行来显着提高性能并减少系统负载。例如…
my_function () {
### ALWAYS CHECK THE RETURN CODE
# one argument required. "" evaluates to false(1)
[[ "$1" ]] || return 1
# work with the argument. exit on failure
do_something_with "$1" || return 1
do_something_else || return 1
# Success! no failures detected, or we wouldn't be here
return 0
}