免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Shell_HAT
打印 上一主题 下一主题

[其他] shell技术讨论--实际工作中的应用(获奖名单已公布-2014-4-21) [复制链接]

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
1 [报告]
发表于 2014-03-21 17:39 |显示全部楼层
回复 4# seesea2517

原来看海兄这么牛掰的,orz~
原来看海兄叫做亚丹,你的夏蛙呢?
   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
2 [报告]
发表于 2014-03-23 01:42 |显示全部楼层
本帖最后由 yestreenstars 于 2014-03-23 11:51 编辑

回复 1# Shell_HAT

闲着没事,我也来凑凑热闹~

话题一,你当初为什么选择了学习shell?
我写shell的能力一般,有时为了帮人写一个shell还得东查西查才能写出来,学习shell的目的是为了以后方便以后找运维相关的工作,因为shell在处理Linux相关工作时实在是非常强大,它能直接调用系统的命令,完成一些重复性的工作。在shell的众多命令中,我对awk和sed比较熟悉,当初学习它们纯粹是为了兴趣,就算是运维,也很少用到这两个命令吧,所以我学习它们并不是为了以后的工作。

话题二,在你的实际工作中,用shell实现了哪些功能?请给出详细的背景介绍、完整的源代码和注释,这将是我们评选的重要标准之一,如有隐私信息请做无害化处理。
在实际工作中,因为我不是做运维的,所以用到shell脚本的机会不多,我用到的shell脚本都是一些很简单的脚本,比如挂载NFS,短短的几行,不值一提,但我经常在CU上做题,也写过几个比较长的awk脚本,所以我还是以我比较拿手的awk来说吧(awk脚本也算是shell脚本的一种嘛)。
以下是我写过的awk脚本之一:
  1. #!/bin/awk -f

  2. #在脚本的开头将FS设为空字符串,然后将0-99没有规律的数字存入对应下标的数组。
  3. BEGIN {
  4.         FS=""
  5.         a[0]="zero"
  6.         a[1]="one"
  7.         a[2]="two"
  8.         a[3]="three"
  9.         a[4]="four"
  10.         a[5]="five"
  11.         a[6]="six"
  12.         a[7]="seven"
  13.         a[8]="eight"
  14.         a[9]="nine"
  15.         a[10]="ten"
  16.         a[11]="eleven"
  17.         a[12]="twelve"
  18.         a[13]="thirteen"
  19.         a[14]="fourteen"
  20.         a[15]="fifteen"
  21.         a[16]="sixteen"
  22.         a[17]="seventeen"
  23.         a[18]="eighteen"
  24.         a[19]="nineteen"
  25.         a[20]="twenty"
  26.         a[30]="thirty"
  27.         a[40]="forty"
  28.         a[50]="fifty"
  29.         a[60]="sixty"
  30.         a[70]="seventy"
  31.         a[80]="eighty"
  32.         a[90]="ninety"
  33. }

  34. {
  35.         #遍历每一个数字
  36.         for (i=1;i<=NF;i++) {
  37.                 #计算出当前数字所处的位置(以下简称“当前位置”)。
  38.                 t=NF-i+1
  39.                 #初始化k的值,用于判断千分位是否需要增加逗号。
  40.                 k=0
  41.                 #当前数字为0就跳过后面的代码,进入下一个循环,加上i>1的目的是防止跳过对0这个数字的转换。
  42.                 if (!$i&&i>1) continue
  43.                 #对当前位置与3进行取余,如果为0,就表示它是百分位,那我们就将当前数字转化为英文,并在它后面加上“百”的英文,然后判断它的下一个数字是不是0,如果是0,就打印“和下下个数字”对应的英文,并使i的值加2,否则就打印“和”的英文;如果当前位置与3取余的结果是2,就表示当前位置是十分位,然后判断它是1还是其他数字,如果是1,就打印它和它的下一个数字所对应的英文,否则,判断下一个数字是否为0,如果是0就直接打印当前数字乘于10对应的英文,否则就打印当前数字和下一个数字对应的英文,并用连字符连起来,最后i的值自增1;如果取余的结果不是0,也不是2,就直接打印当前数字对应的英文。
  44.                 if (!(t%3)) {
  45.                         printf a[$i]" hundred"
  46.                         if (!$(i+1)) {
  47.                                 if ($(i+2)) printf " and "a[$(i+2)]
  48.                                 i+=2
  49.                         } else printf " and "
  50.                 } else if (t%3==2) {
  51.                         if ($i=="1") {
  52.                                 printf a[$i$(i+1)]
  53.                         } else {
  54.                                 if ($(i+1)) printf a[$i*10]"-"a[$(i+1)];else printf a[$i*10]
  55.                         }
  56.                         i++
  57.                 } else printf a[$i]
  58.                 #重新计算当前位置(因为前面的操作可能改变了i的值)。
  59.                 t=NF-i+1
  60.                 #如果当前位置是4,就打印“千”的英文,依此类推。
  61.                 if (t==4) printf " thousand"
  62.                 if (t==7) printf " million"
  63.                 if (t==10) printf " billion"
  64.                 #如果当前位置与3取余的结果为1,就表示它是千分位,接下来要看看它后面有没有不为0的数字,如果有,k=1,并在循环结束后根据k的值判断是否需要加上逗号。
  65.                 if (t%3==1) {
  66.                         for (j=i+1;j<=NF;j++) if ($j) k=1
  67.                         if (k) printf ","
  68.                 }
  69.         }
  70.         #最后打印换行符。
  71.         print ""
  72. }
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
3 [报告]
发表于 2014-03-26 00:20 |显示全部楼层
回复 22# wenhq

什么地方啊?
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP