- 论坛徽章:
- 32
|
本帖最后由 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脚本之一:- #!/bin/awk -f
- #在脚本的开头将FS设为空字符串,然后将0-99没有规律的数字存入对应下标的数组。
- BEGIN {
- FS=""
- a[0]="zero"
- a[1]="one"
- a[2]="two"
- a[3]="three"
- a[4]="four"
- a[5]="five"
- a[6]="six"
- a[7]="seven"
- a[8]="eight"
- a[9]="nine"
- a[10]="ten"
- a[11]="eleven"
- a[12]="twelve"
- a[13]="thirteen"
- a[14]="fourteen"
- a[15]="fifteen"
- a[16]="sixteen"
- a[17]="seventeen"
- a[18]="eighteen"
- a[19]="nineteen"
- a[20]="twenty"
- a[30]="thirty"
- a[40]="forty"
- a[50]="fifty"
- a[60]="sixty"
- a[70]="seventy"
- a[80]="eighty"
- a[90]="ninety"
- }
- {
- #遍历每一个数字
- for (i=1;i<=NF;i++) {
- #计算出当前数字所处的位置(以下简称“当前位置”)。
- t=NF-i+1
- #初始化k的值,用于判断千分位是否需要增加逗号。
- k=0
- #当前数字为0就跳过后面的代码,进入下一个循环,加上i>1的目的是防止跳过对0这个数字的转换。
- if (!$i&&i>1) continue
- #对当前位置与3进行取余,如果为0,就表示它是百分位,那我们就将当前数字转化为英文,并在它后面加上“百”的英文,然后判断它的下一个数字是不是0,如果是0,就打印“和下下个数字”对应的英文,并使i的值加2,否则就打印“和”的英文;如果当前位置与3取余的结果是2,就表示当前位置是十分位,然后判断它是1还是其他数字,如果是1,就打印它和它的下一个数字所对应的英文,否则,判断下一个数字是否为0,如果是0就直接打印当前数字乘于10对应的英文,否则就打印当前数字和下一个数字对应的英文,并用连字符连起来,最后i的值自增1;如果取余的结果不是0,也不是2,就直接打印当前数字对应的英文。
- if (!(t%3)) {
- printf a[$i]" hundred"
- if (!$(i+1)) {
- if ($(i+2)) printf " and "a[$(i+2)]
- i+=2
- } else printf " and "
- } else if (t%3==2) {
- if ($i=="1") {
- printf a[$i$(i+1)]
- } else {
- if ($(i+1)) printf a[$i*10]"-"a[$(i+1)];else printf a[$i*10]
- }
- i++
- } else printf a[$i]
- #重新计算当前位置(因为前面的操作可能改变了i的值)。
- t=NF-i+1
- #如果当前位置是4,就打印“千”的英文,依此类推。
- if (t==4) printf " thousand"
- if (t==7) printf " million"
- if (t==10) printf " billion"
- #如果当前位置与3取余的结果为1,就表示它是千分位,接下来要看看它后面有没有不为0的数字,如果有,k=1,并在循环结束后根据k的值判断是否需要加上逗号。
- if (t%3==1) {
- for (j=i+1;j<=NF;j++) if ($j) k=1
- if (k) printf ","
- }
- }
- #最后打印换行符。
- print ""
- }
复制代码 |
|