在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显得更加简洁