在shell中用善用||和&&可以简化shell的编写
1)op1||op2
这个是“或”操作,op1,op2分别表示:操作1,操作2
整个表达式从左至右,只要op1不为真,就继续op2,相当于
if ! [[ op1 ]];then op2 fi
比如:
if ! [[ 1 == 2 ]];then echo ok fi
可以写成
! [[ 1 == 2 ]] || echo ok
2) op1&&op2
这个是“与”操作,op1,op2分别表示:操作1,操作2
整个表达式从左至右,只要op1为真,就继续op2,相当于
if [[ op1 ]];then op2 fi
比如:
if [[ 1 == 1 ]];then echo ok fi
可以写成
[[ 1 == 1 ]] && echo ok
3) op1&&op2||op3
整个表达式从左至右,只要op1为真,就继续op2,否则op3,相当于
if [[ op1 ]];then op2 else op3 fi
比如:
if [[ 1 == 1 ]];then echo ok else echo no
可以写成
[[ 1 == 1 ]] && echo ok || echo no
再复杂的逻辑还是用if else语句吧,不然可读性会变差。
3) 应用举例
综上所示,用||和&&可以减少if else语句
比如如下一段
cd /var/backups || exit 0 for FILE in passwd group shadow gshadow; do test -f /etc/$FILE || continue cmp -s $FILE.bak /etc/$FILE && continue cp -p /etc/$FILE $FILE.bak && chmod 600 $FILE.bak done
这是从系统中定时任务中找到的一个定时备份/etc/passwd,group,shadow,gshadow文件的例子
如果使用if else的形式,可能就是如下样子
if cd /var/backups;then exit 0 fi for FILE in passwd group shadow gshadow; do if ! test -f /etc/$FILE;then continue elif cmp -s $FILE.bak /etc/$FILE;then continue elif cp -p /etc/$FILE $FILE.bak;then chmod 600 $FILE.bak fi done
原shell虽然没有用到if else语句,但是同样达到了if else的效果,而且整个shell显得更加简洁