Shell的那些事儿
日常工作中,哪种语言对你的帮助最大?我觉得非Shell莫属。最早接触Shell应该是在大学的时候,如做Linux文件系统裁减会用到一些命令,如find, tar, xargs, cp等等,并把它们通过SHELL组合起来。但现实项目中最早接触到Shell脚本,其实是Windows的批处理脚本,BAT脚本被用于在EFI测试过程中的自动化测试。那真是一套庞大的脚本,也是对学生时代的一个冲击。
毕业后开始工作时,工作环境主要还是在Linux下面,不可避免地会用上各种命令,并尝试着用这些命令解决一些实际问题,如递归列举出当前目录下所有的文本文件,当系统浏览完grep的man文档后,其实只需要一条命令,如你想知道/bin目录下是否有些命令是简单的Shell脚本而已:
$ grep -Irl '.*' /bin /bin/unicode_start /bin/unicode_stop /bin/redhat_lsb_init /bin/gawk
-I用于指定不匹配任何二进制文件,-r递归搜索子目录,-l当匹配上一行时打印文件名而跳过当前文件,因为我们提供的匹配是个万能匹配,因此所有可能的非空文本文件就都被列举出来了。
还比如,想统计一下最近编写了多少行代码:
$ find service/ -name *.java |xargs wc -l 46 service/ServiceFactory.java 94 service/IShopService.java 1779 service/ShopService.java 1919 total
当然,偶尔还会用用AWK或者SED,如把上面的命令重写一遍,自己实现后面的累计功能:
$ find service -name *.java |xargs wc -l|grep -v total | awk ' > BEGIN {sum=0;fnum=0;} > {sum=sum+$1; printf "%-40s %s\n",$2,$1; fnum=fnum+1; } > END {printf "Total files: %s,\tTotal lines: %s\n",fnum,sum} > ' service/ServiceFactory.java 46 service/IBookShopService.java 94 service/BookShopService.java 1779 Total files: 3, Total lines: 1919
后来,加入Real-World Performance Group后,写脚本的干劲一发不可收拾。这主要归功于日常项目对Shell的强势需求,还有一班对Shell非常精通的外国同事。一些以前没用到的实用功能开始变成工作习惯。最实用的一个功能,莫过于如何定位BASH脚本的错误。调试选项-x可以打印出整个Shell脚本的执行过程,这个选项在脚本编写过程发挥了巨大的作用。还有如何给参数设置默认值,如何利用set动态处理数组。同时,还学到了很多利用Shell编写项目实际案例业务逻辑的方法。如如何实现多进程并发和排队,当某进程完成后,排队队列中的第一个进程得到机会继续运行。
回过头来,Shell语言的设计初衷或者就是实用方便快捷,有些时候可能给人以不严谨的感觉。不像C语句,回车与否会影响到Shell语句的解析。如 if 语句起码有以下三种形式:
# First form if condition then commands fi # Second form if condition; then commands fi # Third form if condition; then commands; fi
一行代码基本等于一行语句,如果想在一行包含多个语句,就必须用;分隔,懂得了这一点,你就不会漏掉某些分号或者多添加一些不必要的分号了。
还有,condltion其实可以是一个命令,根据命令的成功与否决定是否执行相应的命令,看起来是非常方便的设计,如
if gcc demo.c -o demo then ./demo fi
当然,可以利用命令的返回值$?做判断,成功时$? 的值将为0:
gcc demo.c -o demo if [ $? = 0 ] then ./demo fi
当然,上面的逻辑可以简单用&&实现:
gcc demo.c -o demo && ./demo
相对于高级语句如C/C++/Java,Shell其实应该是一门最容易上手,也能够给工作带来最大便利的工具性语言,无论是写写程序做下并发的压力测试,还是实现比较复杂的控制逻辑,Shell语句的开发效率一般都比那些高级语言要高,不需要编译,一写完马上可以测试。在这个追求效率的年代,不熟悉Shell都不好意思说会性能调优啊。
建议继续学习:
- 你可能不知道的Shell (阅读:6917)
- 面向对象的Shell脚本 (阅读:5142)
- 在 shell 脚本里打日志 (阅读:4766)
- Bash如何取得当前正在执行的脚本的绝对路径? (阅读:4772)
- 使用Shell快捷键助你一臂之力 (阅读:4482)
- Bash Shell 快捷键 (阅读:3987)
- 加密你的shell (阅读:3583)
- shell文件存在相关判断参数 (阅读:3546)
- Unix考古记:一个“遗失”的shell (阅读:3275)
- shell常用的判断条件 (阅读:2950)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Kaya 来源: OS与Oracle
- 标签: Shell
- 发布时间:2013-05-29 22:36:11
- [68] Go Reflect 性能
- [68] 如何拿下简短的域名
- [67] Oracle MTS模式下 进程地址与会话信
- [62] IOS安全–浅谈关于IOS加固的几种方法
- [61] 图书馆的世界纪录
- [60] 【社会化设计】自我(self)部分――欢迎区
- [58] android 开发入门
- [56] 视觉调整-设计师 vs. 逻辑
- [49] 给自己的字体课(一)——英文字体基础
- [48] 读书笔记-壹百度:百度十年千倍的29条法则