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

Shell的那些事儿的更多相关文章

  1. 说说Makefile那些事儿

    说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...

  2. Linux关于添加硬盘的那些事儿:笔记

    添加新硬盘:http://note.youdao.com/share/?id=8cf27602cdce36e1d4160f00e9004b00&type=note 关于添加硬盘的那些事儿:   ...

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

    有些时候,需要通过DOS批处理来编译整个项目的JAVA文件:并且编译后还要对Class文件进行打包成jar文件...这还不是最烦的,最烦的是,编译和打包的时候需要依赖其他多个jar文件,困难就这么来了 ...

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

    对于Oracle运维中的那些事儿,我的最终目的:不是比谁更惨,而是能够从中吸取经验和教训. 从我的理解来看,我会从下面的几个方面来进行说明DBA运维中的一些事儿. 每个部分都是非常关键的,缺一不可,而 ...

  5. shell编程其实真的很简单(二)

    上篇我们学会了如何使用及定义变量.按照尿性,一般接下来就该学基本数据类型的运算了. 没错,本篇就仍是这么俗套的来讲讲这无聊但又必学的基本数据类型的运算了. 基本数据类型运算 操作符 符号 语义 描述 ...

  6. Linux Shell 编程语法

    原文地址:http://www.cnblogs.com/fhefh/archive/2011/04/13/2014967.html.感谢作者的无私分享 编写代码 在计划好要程序干什么以及如何使用程序的 ...

  7. shell符号解释

    #符号详解 () 在子shell中运行 (a=1);echo $a,结果是空,因为a=1不是在当前shell中运行的(a=1);(echo $a)也是空的 小技巧:(cd $path, do some ...

  8. 命令行界面 (CLI)、终端 (Terminal)、Shell、TTY的区别

    虽然这个话题已是老生常谈,搜索一下应该也能找到大把的相关文章.不过难得提到了这方面,就趁此机会把我的理解写下来,一来看看我是不是真正理解了,二来看看我能不能把它们之间的区别讲得更加简明易懂. 0. 太 ...

  9. 【shell】shell编程(二)-运算符

    上篇我们学会了如何使用及定义变量.按照尿性,一般接下来就该学基本数据类型的运算了. 没错,本篇就仍是这么俗套的来讲讲这无聊但又必学的基本数据类型的运算了. 基本数据类型运算 操作符 符号 语义 描述 ...

随机推荐

  1. 异步委托 多线程实现摇奖器 winform版

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  2. Unity3d Shader开发(三)Pass(Fog )

    雾参数用于雾命令控制. 雾化是通过混合已生成的像素的颜色和基于到镜头的距离来确定的一个不变色来完成.雾化不会改变已经混合的像素的透明度值,只是改变RGB值. Syntax 语法 Fog { Fog C ...

  3. listview滚动时背景闪烁,背景黑或白问题解决

    android在使用listview时出现滚动时背景闪烁,变成背景黑或白的问题这样处理: 1:在布局文件中listview标签中加入: android:cacheColorHint="#00 ...

  4. Python之创建tuple

    tuple是另一种有序的列表,中文翻译为" 元组 ".tuple 和 list 非常类似,但是,tuple一旦创建完毕,就不能修改了. 同样是表示班里同学的名称,用tuple表示如 ...

  5. 微软Hololens学院教程-Hologram 210 Gaze(凝视)【微软教程已经更新,本文是老版本】

    这是老版本的教程,为了不耽误大家的时间,请直接看原文,本文仅供参考哦!原文链接:https://developer.microsoft.com/EN-US/WINDOWS/HOLOGRAPHIC/ho ...

  6. How To Call Stored Procedure In Hibernate

    How To Call Stored Procedure In Hibernate In this tutorial, you will learn how to call a store proce ...

  7. Mysql Not in有null值查询的问题

    今天发现Mysql的not in使用的一个问题,大致是: select * from A where id not in (select fid from B). 发现查询结果无论如何都是0条记录.后 ...

  8. push 栈顶sp=sp-2 可以把立着的栈,向左侧倒下,那么形态就和反汇编时,内存的形态是一样的。小偏移的字节在前, 大的偏移字节在后

    push  栈顶sp=sp-2 可以把立着的栈,向左侧倒下,那么形态就和反汇编时,内存的形态是一样的.小偏移的字节在前, 大的偏移字节在后. 1 2 3 4 5 1 2 3 4 5

  9. 安装edX DevStack

    概述 edX Developer Stack 就是通常我们所说的Devstack,是为本地开发所设计的一个Vagrant实例. Devstack: 和产品(edx Product Stack)对系统的 ...

  10. [topcoder]TallPeople

    水题.http://community.topcoder.com/stat?c=problem_statement&pm=2923&rd=5854 一开始错了是因为理解错题意.还有就是 ...