在C语言中三目运算符的组成是
<表达式1>?<表达式2>:<表达式3>;
等同于C语言中的if语句
if (表达式1) 表达式2; else 表达式3;
而在bash shell 中也有类似的方式
echo $((2>1?2:1))
但是這里 $(()) 只能进行数值大小的判断
使用command进行三目运算应该这样使用
command1 && command2 || command3
在shell中,很多人理解为下面的if语句
if command1;then command2 else command3 fi
这是错误的,原因是没有深刻理解&& 和 ||
下面的命令很好的指出错误的原因
#date && echo "It's sunny today" || echo "the weather is terrible" Thu Aug 20 11:09:35 EDT 2015 It's sunny today #date && "It's sunny today" || echo "the weather is terrible" Thu Aug 20 11:10:45 EDT 2015 -bash: It's sunny today: command not found the weather is terrible
||会判断前一条命令的状态还回值,如果为false,就执行后面的语句
在这里 “It’s sunny today” 命令是错误的,于是后面 echo “the weather is terrible” 就执行了
深入研究
使用{}解决||判断问题
command1 && { command2 ;echo -n ;} || commadn3
如果command1正确 ||就只会接受来自echo -n的状态还回值,所以不会执行后面的command3
如果command1失败 &&直接跳过,||判断command1失败,执行command3
三目运算符的主要目的是达到简写的功能,避免不必要的简单if语句
在日常使用中 1 && 2 || 3 确实很实用
下面举几个列子
判断文件是否存在,如果存在就继续执行脚本,不存在就退出报错
使用if判断文件存在,然后else部分写exit。~~but,
if [ -e $path ];then ?? else exit 1 fi
如果文件存在如何进行?
这个时候只能反向思路,不存在怎么样,但是这样就和判断逻辑相反
if [ ! -e $path ];then exit 1 fi
但是这样就简便了很多
[ -e $path ] || exit 1
需要有顺序的连续执行多条命令,并且判断命令正确,如果命令错误就执行 “echo error”
在这里如果使用if就需要嵌套多层,十分麻烦,也浪费时间
if command1;then if command2;then if command3;then command4 else echo "error" fi else echo "error" fi else echo "error" fi
而使用&&就简化了很多
commad1 && command2 && command3 && command4 || echo "error"
博主很喜欢使用三目运算符进行逻辑的判断
下面是举例
#在很多脚本中需要版判系统是否存在安装包或者命令 [ -e /usr/sbin/iptables ] || { echo "iptables-services not installed" && exit 1 ;} #博主编写比较两个文件夹差异的脚本中,如果参数是两个存在的文件进行的判断 [ -f "$1" ] && [ -f "$2" ] && { cmp $1 $2 >/dev/null 2>&1 && echo 'The two files are the same' && exit 0|| { echo -ne $red 'The two files are not same'\n && exit 0 ;} ;}