IT技术博客大学习 共学习 共进步

Shell的那些事儿

OS与Oracle 2013-05-29 22:36:11 浏览 4,425 次

   日常工作中,哪种语言对你的帮助最大?我觉得非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都不好意思说会性能调优啊。

建议继续学习

  1. 你可能不知道的Shell (阅读 8,163)
  2. 在 shell 脚本里打日志 (阅读 6,044)
  3. 面向对象的Shell脚本 (阅读 5,984)
  4. Bash如何取得当前正在执行的脚本的绝对路径? (阅读 5,843)
  5. 使用Shell快捷键助你一臂之力 (阅读 5,385)
  6. Bash Shell 快捷键 (阅读 4,883)
  7. 加密你的shell (阅读 4,844)
  8. shell文件存在相关判断参数 (阅读 4,703)
  9. Unix考古记:一个“遗失”的shell (阅读 4,445)
  10. shell常用的判断条件 (阅读 3,962)