Shell的那些事儿

日常工作中,哪种语言对你的帮助最大?我觉得非Shell莫属。最早接触Shell应该是在大学的时候,如做Linux文件系统裁减会用到一些命令,如find, tar, xargs, cp等等,并把它们通过SHELL组合起来。但现实项目中最早接触到Shell脚本,其实是Windows的批处理脚本,BAT脚本被用于在EFI测试过程中的自动化测试。那真是一套庞大的脚本,也是对学生时代的一个冲击。

毕业后开始工作时,工作环境主要还是在Linux下面,不可避免地会用上各种命令,并尝试着用这些命令解决一些实际问题,如递归列举出当前目录下所有的文本文件,当系统浏览完grep的man文档后,其实只需要一条命令,如你想知道/bin目录下是否有些命令是简单的Shell脚本而已:

?


1

2

3

4

5

$ grep -Irl ‘.*‘ /bin

/bin/unicode_start

/bin/unicode_stop

/bin/redhat_lsb_init

/bin/gawk

-I用于指定不匹配任何二进制文件,-r递归搜索子目录,-l当匹配上一行时打印文件名而跳过当前文件,因为我们提供的匹配是个万能匹配,因此所有可能的非空文本文件就都被列举出来了。

还比如,想统计一下最近编写了多少行代码:

?


1

2

3

4

5

$ find service/ -name *.java |xargs wc -l

   46 service/ServiceFactory.java

   94 service/IShopService.java

 1779 service/ShopService.java

 1919 total

当然,偶尔还会用用AWK或者SED,如把上面的命令重写一遍,自己实现后面的累计功能:

?


1

2

3

4

5

6

7

8

9

$ 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 语句起码有以下三种形式:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

# First form

if condition

then

  commands

fi

 

# Second form

if condition; then

  commands

fi

 

# Third form

if condition; then  commands; fi

一行代码基本等于一行语句,如果想在一行包含多个语句,就必须用;分隔,懂得了这一点,你就不会漏掉某些分号或者多添加一些不必要的分号了。

还有,condltion其实可以是一个命令,根据命令的成功与否决定是否执行相应的命令,看起来是非常方便的设计,如

?


1

2

3

4

if gcc demo.c -o demo

then

  ./demo

fi

当然,可以利用命令的返回值$?做判断,成功时$? 的值将为0:

?


1

2

3

4

5

gcc demo.c -o demo

if [ $? = 0 ]

then

  ./demo

fi

当然,上面的逻辑可以简单用&&实现:

?


1

gcc demo.c -o demo &&  ./demo

相对于高级语句如C/C++/Java,Shell其实应该是一门最容易上手,也能够给工作带来最大便利的工具性语言,无论是写写程序做下并发的压力测试,还是实现比较复杂的控制逻辑,Shell语句的开发效率一般都比那些高级语言要高,不需要编译,一写完马上可以测试。在这个追求效率的年代,不熟悉Shell都不好意思说会性能调优啊。

时间: 2024-10-08 10:29:22

Shell的那些事儿的相关文章

rsync那点事儿

rsync那点事儿 ---石锅拌饭 1.关于rsync rsync是remote synchronize的简称,是一款远程同步软件,在项目中多有用到.其采用的rsync算法(酷壳上有一篇介绍rsync核心算法的博文rsync的核心算法)提供了一种比较快速的方法用于客户机和远程文件服务器同步. rsync的特点是安装和配置都比较方便,然后同步文件时能够保持符号链接,硬链接,权限,文件时间,文件归属等数学.安全性方面则提供了密码.读写权限控制和IP权限控制. 2.rsync安装和配置 由于我用的是u

rsync那些事儿

rsync那些事儿 1.关于rsync rsync是remote synchronize的简称,是一款远程同步软件,在项目中多有用到.其采用的rsync算法(酷壳上有一篇介绍rsync核心算法的博文rsync的核心算法)提供了一种比较快速的方法用于客户机和远程文件服务器同步. rsync的特点是安装和配置都比较方便,然后同步文件时能够保持符号链接,硬链接,权限,文件时间,文件归属等数学.安全性方面则提供了密码.读写权限控制和IP权限控制. 2.rsync安装和配置 由于我用的是ubuntu,已经

(转载)linux那点事儿(中)

原文地址:http://www.cnblogs.com/fnng/archive/2012/03/19/2407162.html 本文只是转载供自己学习之用 2012-03-22 13:31 by 虫师, 2343 阅读, 5 评论, 收藏, 编辑 今天是辞职后的第一天,本来想写写工作总结,还有许多东西需要整理和学习.这是我继毕业之后的第二次焦虑和迷茫.希望我能早点找到工作吧! 步入正题,其实,linux要学的东西非常多.不是我分个上.中.下三篇博文就能写完的.不过,既然弄了个“上”出来,题目我

DBA避坑宝典:Oracle运维中的那些事儿

对于Oracle运维中的那些事儿,我的最终目的:不是比谁更惨,而是能够从中吸取经验和教训. 从我的理解来看,我会从下面的几个方面来进行说明DBA运维中的一些事儿. 每个部分都是非常关键的,缺一不可,而且每一部分都有很多的东西可以细化,我会逐一展开来说. (一)环境篇 首先来说说环境篇. DBA的角色及分工 对于DBA的分工,以前的公司对于DBA角色划分粒度还是很细的. 大体是按照核心和客户化定制层来划分的,核心层主要负责产品化,客户化层面主要负责定制.属于不同的产品线但又彼此紧密关联. Phys

(转载)linux那点事儿(上)

原文地址:http://www.cnblogs.com/fnng/archive/2012/03/19/2407162.html 本文只是转载供自己学习之用 本文算是学linux的学习笔记吧!其实linux与window差别还是有挺大的,在学linux时进量清空自己的windows思维,不然容易钻牛角尖.记是学过C之后,去学JAVA,老是用C的思维去看JAVA,所以,就是难入门.因为一个是面向过程的,一个是面向对象的.如果你抛开windows的思想,从零来学linux,其实,它没想象的那么难.每

基于CentOS的Hadoop分布式环境的搭建——你要知道自己到底该做哪些事儿

首先,要说明的一点的是,我不想重复发明轮子.如果想要搭建Hadoop环境,网上有很多详细的步骤和命令代码,我不想再重复记录. 其次,我要说的是我也是新手,对于Hadoop也不是很熟悉.但是就是想实际搭建好环境,看看他的庐山真面目,还好,还好,最好看到了.当运行wordcount词频统计的时候,实在是感叹hadoop已经把分布式做的如此之好,即使没有分布式相关经验的人,也只需要做一些配置即可运行分布式集群环境. 好了,言归真传. 在搭建Hadoop环境中你要知道的一些事儿: 1.hadoop运行于

Linux终端那件事儿

在这里,我们将会讨论如何更好的控制用户终端:也就说是键盘输入与屏幕输出.除了这些,我们还会了解我们编写的程序如何由用户处读取输入,即使是在输入重定向的情况下,以及确保输出到屏幕的正确位置. 这里所提供的一些底层访问也许正是我们所寻找的.我们在这里所涉及的大部分内容也同样可以很好的适用于运行在终端窗口下的程序,例如KDE的Konsole,GNOME的gnome-terminal,或者是标准的X11 xterm. 在这一章,我们将会了解下面一些内容: 终端读取 终端驱动器以及通用终端接口termio

通过DOS、SHELL批处理命令加载Lib并编译和打包Java项目(或者运行项目)

有些时候,需要通过DOS批处理来编译整个项目的JAVA文件:并且编译后还要对Class文件进行打包成jar文件...这还不是最烦的,最烦的是,编译和打包的时候需要依赖其他多个jar文件,困难就这么来了.... 项目结构App |-dest | |-libs(copy过来的依赖库) | |-bin(生成的class文件) | |-libs(依赖库) |-src(需要编译的JAVA源文件) 如果需要对项目编译,首先,需要清理dest文件夹 REM 删除dest包IF EXIST dest RMDIR

adb shell 是什么,如何进入?

本文适合于想了解android系统基础知识,知道大家说的adb shell 到底是怎么回事儿的小白同学. (主要偏向于windows用户,相信如果你用linux...本文可能已经帮不到你什么了) 一,从操作系统开始 windows.linux.Mac.ios.android.meego.. 这个世界上有这么多操作系统呀,看起来风格迥异,相差很多. 但其实它们之间的关系,没有那么远. 它们其实有一个共同的祖先:unix ...(中间省过10000字) 经过N多版本的进化,它们的原理并没有什么本质的