|
本帖最后由 wulishui 于 2020-4-15 13:05 编辑
条件判断的简化用法
一些条件判断可以参考这里:https://blog.csdn.net/wxc_qlu/article/details/82826106
最基本的条件判断用法:
条件=`打电话给MM`
if [ $条件 == "成功通话" ]; then
echo "约她"
fi
这是入门级用法。
还可以这样:
条件=`打电话给MM` ; [ $条件 == "成功通话" ] && echo "约她"
这是中级用法,其中“;”表示前后两条命令只是有先后关系,无条依存关系。“&&”表示后一条命令依存前一条命令的判断结果(成功)执行。(其实使用&&也是可以的,表示前面打通电话才执行下一场判断:条件=`打电话给MM` && [ $条件 == "成功通话" ] && echo "约她")
还可以进一步简化这样用:
打电话给MM && echo "约她"
这就更简单明了了。“&&”表示前一命令成功执行就执行后面的命令,如果前一命令执行不成功,就在前一命令执行后终止。但是需要很明确的条件依存关系才可以用(这命令问题在于,打通电话就要约她,无论她接通就挂还是骂娘,都无法具体判断,通常用于只需要判断一个目标存在就行,而不需要管它是1或2或A或B的情况)。
入门用法基本上不会出问题,踏踏实实使用基本用法可以减少很多基本语法错误。但是复杂的脚本比如有N重判断,这样写起来却很麻烦,一个fi放错位置就都废了,乱起来隔一夜连自己都理不清写的是什么鬼。
下面是这种简化的用法例子:
if [ ! "$HTB" == 2 ] && [ "$qos_download" == 1 ]; then
IFACE="$LAN"
RATE="$DL"
PORT="sport"
[ "$HTB" == 1 ] && add_HTB
[ "$HTB" == 0 ] && add_HFCS
[ "$SFQ" == 1 ] && add_SFQ || add_fq_codel
add_filter_u32
[ "$U32" == 1 ] || add_filter_ipt
fi
很明显,什么条件执行什么命令,自己一眼就清楚,一个大条件 if [ ! "$HTB" == 2 ] && [ "$qos_download" == 1 ]; then中间又有很多条件判断,甚至条件判断中间又有条件判断(实际上, if [ ! "$HTB" == 2 ] && [ "$qos_download" == 1 ]; then已经是两重条件判断,&&在这里的用法不是双条件判断,而且两重条件判断,而使用[ ! "$HTB" == 2 -a "$qos_download" == 1 ]才是双条件判断)。
需要注意,[ "$SFQ" == 1 ] && add_SFQ || add_fq_codel 编写这条命令的本意表示如果[ "$SFQ" == 1 ]成立,就执行后面的add_SFQ,否则就执行add_fq_codel。但实际上不是我们想要的这样,实际上是[ "$SFQ" == 1 ] && add_SFQ是一个整体,表示这整体中随便一个不成功都会执行add_fq_codel,但是在这里用问题不大,因为我确定add_SFQ执行一定不会失败的,如果不能确定,就一定不要用,老老实实用基础用法。这就是为什么下面这两条不用 [ "$HTB" == 1 ] && add_HTB || add_HFCS 的原因:
[ "$HTB" == 1 ] && add_HTB
[ "$HTB" == 0 ] && add_HFCS
&&和||单独使用都是表示运行条件建立在前一条命令基础上的,而不是第一条,但是&&和||组合应用时却不是同一回事。
所以 [ "$SFQ" == 1 ] && add_SFQ || add_fq_codel这样用不是稳妥的,而是要用:
[ "$SFQ" == 1 ] && add_SFQ
[ "$SFQ" == 0 ] && add_fq_codel
这里引申出一个问题:
[ "$SFQ" == 1 ] && add_SFQ || add_fq_codel 本意我是要"$SFQ" == 1就运行add_SFQ,"$SFQ" == 0运行add_fq_codel,但实际上有时候有$SFQ" == 2,$SFQ" == 3这种情况,在这种情况下,add_fq_codel也会运行。所以,使用[ "$SFQ" == 1 ] && add_SFQ ; [ "$SFQ" == 0 ] && add_fq_codel两条命令可以稳稳妥妥避免任何问题。所以,下一步我这命令已经改成了:
if [ ! "$HTB" == 2 ] && [ "$qos_download" == 1 ]; then
IFACE="$LAN"
RATE="$DL"
PORT="sport"
[ "$HTB" == 1 ] && add_HTB
[ "$HTB" == 0 ] && add_HFCS
[ "$SFQ" == 1 ] && add_SFQ
[ "$SFQ" == 0 ] && add_fq_codel
add_filter_u32
[ "$U32" == 1 ] || add_filter_ipt
fi
上面这段命令如果使用基础用法,是这样的:
if [ ! "$HTB" == 2 ]; then
if [ "$qos_download" == 1 ]; then
IFACE="$LAN"
RATE="$DL"
PORT="sport"
if [ "$HTB" == 1 ]; then
add_HTB
else
add_HFCS
fi
if [ "$SFQ" == 1 ];then
add_SFQ
else
add_fq_codel
fi
add_filter_u32
if [ "$U32" == 0 ]; then
add_filter_ipt
fi
fi
fi
是不是有点眼花?
|
|