免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3901 | 回复: 7
打印 上一主题 下一主题

[学习共享] 公司shell 脚本这段代码的含义 [复制链接]

论坛徽章:
1
子鼠
日期:2013-11-26 22:29:42
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-21 20:33 |只看该作者 |倒序浏览
请教大家一个问题,公司设备上有统计不同类型业务,上下行(UP/Down)流量如下脚本,没有看懂,大家帮我一起看下大体语法的含义吧:
#! /bin/bash
num=0
len=0
while read line                             #############这行是什么意思
do
         ms=($line)                        #######没有明白
         ((len=${#ms[@]}-1))        #######没有明白
     up=0
     down=0
         for (( i=4,j=3; j<=$len; i=i+3,j=j+3 ))
         do
             ((num=$num+1))           #######这里边的括号为什么是两个?如果换成(num=$num+1)可以吗?
             ((up=$up+${ms[$i]}))
             ((down=$down+${ms[$j]}))
     done
             ((all=$down+$up))
         echo ${ms[2]}" "${ms[0]}" "${ms[1]}" "$up" "$down" "$all
done  < $1
echo $num
  

谢谢大家了

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
2 [报告]
发表于 2013-11-21 21:08 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
3 [报告]
发表于 2013-11-21 21:17 |只看该作者
本帖最后由 关阴月飞 于 2013-11-21 21:32 编辑

回复 1# 零下五度_


  1. #! /bin/bash
  2. num=0
  3. len=0
  4. while read line                             #开始while 循环, 用read 从$1 文件中读取一行内容 存在变量line中
  5. do
  6.          ms=($line)                        #将$line 的内容建立为一个数组 ms
  7.          ((len=${#ms[@]}-1))        #得到数组ms的长度 存在变量len中, 更常见的用法是:len=$[${#ms[@]}-1]
  8.      up=0
  9.      down=0
  10.          for (( i=4,j=3; j<=$len; i=i+3,j=j+3 ))
  11.          do
  12.              ((num=$num+1))           #将num的值加1, 更普遍的做法是 let num++
  13.              ((up=$up+${ms[$i]}))    #将up的值增加 , 更普遍的做法是 let up+=${ms[$i]}
  14.               ((down=$down+${ms[$j]})) #同上
  15.      done
  16.              ((all=$down+$up))    #同上
  17.          echo ${ms[2]}" "${ms[0]}" "${ms[1]}" "$up" "$down" "$all
  18. done  < $1  #将参数1(是一个文件)的内容传给while 循环体处理。
  19. echo $num
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
4 [报告]
发表于 2013-11-22 07:15 |只看该作者
关阴月飞解释得太详细了。这个for loop 写得有些意思啊,很少这样写法的。
  1. for (( i=4,j=3; j<=$len; i=i+3,j=j+3 ))
复制代码
@零下五度_
楼主给些$1 文件的例子吧。

论坛徽章:
6
摩羯座
日期:2013-12-27 09:45:04技术图书徽章
日期:2014-01-27 12:40:06辰龙
日期:2014-02-28 15:12:52巳蛇
日期:2014-03-21 17:06:27未羊
日期:2014-04-15 20:12:41黑曼巴
日期:2016-08-02 11:00:06
5 [报告]
发表于 2013-11-23 14:16 |只看该作者
回复 3# 关阴月飞
((len=${#ms[@]}-1))  关于这句 应该得到的是数组最大索引吧

   

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
6 [报告]
发表于 2013-11-23 18:33 |只看该作者
laliheyi 发表于 2013-11-23 14:16
回复 3# 关阴月飞
((len=${#ms[@]}-1))  关于这句 应该得到的是数组最大索引吧


确实是这样,
数组的长度-1

论坛徽章:
1
子鼠
日期:2013-11-26 22:29:42
7 [报告]
发表于 2013-11-23 21:21 |只看该作者
回复 4# rdcwayx


文本类似如下:
业务开始时间             时长     手机号码         上行   下行   业务类型      上行  下行    业务类型       上行  下行       业务类型
1311222324562B0800 1139 198613198877877F 8947 22423 1157632026 28224 71572 1157632000 113579 1805951 4262854655
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

有些用户使用了多种业务,有些用户使用了一种业务,也就是说,用户使用的业务类型数目是不确定的。
所以需要:            ((len=${#ms[@]}-1))
i和j分别代表上下行,不过貌似脚本里的i,j顺序写反了。   

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
8 [报告]
发表于 2013-11-25 13:30 |只看该作者
写的很不易懂,还啰嗦。
((num++))就好了,非要写(($num=xxx))这种写法.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP