找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2020-4-15 11:37 | 显示全部楼层 |阅读模式
本帖最后由 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.
 楼主| 发表于 2020-4-15 12:30 | 显示全部楼层

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


上面是现在写的脚本

差别巨大吧?

本帖子中包含更多资源

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

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

使用道具 举报

发表于 2020-4-15 12:43 | 显示全部楼层
不错,帮顶!!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-4-15 12:51 | 显示全部楼层
专门登录一下,回帖表示支持! 就是需要楼主这样分享经验的好文章提高水平,不错的!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2020-4-15 13:27 | 显示全部楼层
本帖最后由 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.
回复

使用道具 举报

发表于 2020-4-15 13:28 | 显示全部楼层
回帖表示支持!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-4-18 12:38 | 显示全部楼层
这个好,多发些常用命令的高级用法。特别是sed,find,grep,xargs谢谢!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-4-18 12:59 | 显示全部楼层
很好,非常感谢分享
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-4-24 22:27 | 显示全部楼层
不错,学习了!!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-9-27 20:31 | 显示全部楼层
学习学习一下
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-18 17:57

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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

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