26. 列表结构
and 列表 和 or 列表 结构提供了连续执行若干命令的方法,可以有效地替换复杂的嵌套 if/then ,甚至 case 语句。
链接多个命令
and 列表
command-1 && command-2 && command-3 && ... command-n
只要前一个命令返回 true(即 0),每一个命令就依次执行。当第一个 false(即 非0)返回时,命令链条即终止(第一个返回 false 的命令是最后一个执行的)。
在YongYe早期版本的俄罗斯方块游戏脚本里,一个有趣的双条件 and 列表 用法:
equation()
{ # core algorithm used for doubling and halving the coordinates
[[ ${cdx} ]] && ((y=cy+(ccy-cdy)${2}2))
eval ${1}+=\"${x} ${y} \"
}例 26-1. 使用 and 列表 来测试命令行参数
#!/bin/bash
# and list
if [ ! -z "$1" ] && echo "Argument #1 = $1" && [ ! -z "$2" ] && \
# ^^ ^^ ^^
echo "Argument #2 = $2"
then
echo "At least 2 arguments passed to script."
# 链条内的所有命令都返回 true。
else
echo "Fewer than 2 arguments passed to script."
# 链条内至少有一个命令返回 false。
fi
# 注意: "if [ ! -z $1 ]" 是好用的,但是宣传与之等同的
# "if [ -n $1 ]" 并不好用。
# 不过,用引号就能解决问题,
# "if [ -n "$1" ]" 好用(译者注:原文本行内第一个引号位置错了)。
# ^ ^ 小心!
# 被测试的变量放在引号内总是最好的选择。
# 下面的代码功能一样,用的是“纯粹”的 if/then 语句。
if [ ! -z "$1" ]
then
echo "Argument #1 = $1"
fi
if [ ! -z "$2" ]
then
echo "Argument #2 = $2"
echo "At least 2 arguments passed to script."
else
echo "Fewer than 2 arguments passed to script."
fi
# 比起用“and 列表”要更长、更笨重。
exit $?例 26-2. 使用 and 列表 来测试命令行参数2
当然,and 列表 也可以给变量设置默认值。
or 列表
只要前一个命令返回_false_,每一个命令就依次执行。当第一个_true_ 返回时,命令链条即终止(第一个返回_true_ 的命令是最后一个执行的)。很明显它与“and 列表”相反。
例 26-3. or 列表 与 and 列表 结合使用
如果 or 列表 第一个命令返回 true,它会执行。
_and 列表_ 或 _or 列表_ 的[退出状态](http://tldp.org/LDP/abs/html/exit-status.html#EXITSTATUSREF)就是最后一个执行的命令的退出状态。
聪明地结合 and 列表 和 or 列表 是可能的,但是程序逻辑会很容易地变得令人费解,需要密切注意操作符优先规则,而且,会带来大量的调试工作。
最后更新于
这有帮助吗?