找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 1755|回复: 9

本人原创文章之----------shell条件判断的简化用法

[复制链接]
本帖最后由 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

是不是有点眼花?



我的恩山、我的无线 The best wifi forum is right here.
 楼主| | 显示全部楼层

上面是我入门时候写的脚本


上面是现在写的脚本

差别巨大吧?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

不错,帮顶!!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

专门登录一下,回帖表示支持! 就是需要楼主这样分享经验的好文章提高水平,不错的!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
本帖最后由 wulishui 于 2020-4-15 13:56 编辑

有补充:
&&如果前面是条件判断比如[ $i == * ],表示判断结果成立为“真”;如果前面是命令,表示命令成功执行为真(仅管是否成功执行,而不管命令运行后会给出什么答案)。‖则相反。比如:
uci get uhttp.main.port &&

Port=`uci get uhttp.main.port` ; [ $port == 80 ] &&
相同吗?完全不同的!前面一条只能判断port是否存在(因为值不存在这条uci get就报错,不能成功执行),后面一条能判断这个值是不是80。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

回帖表示支持!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

这个好,多发些常用命令的高级用法。特别是sed,find,grep,xargs谢谢!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

很好,非常感谢分享
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

不错,学习了!!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

学习学习一下
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-27 04:56

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表