深入浅出Shell编程

 

深入浅出Shell编程: 前言

现在编程语言越来越多,C, C++, perl, php, Java ...... 有点让程序员无所适从。每种语言都有其优势,在Unix/Linux平台上,Shell脚本使用非常广泛,其原因在于一群聪明人写了许多工具包,你可以直接在这些工具的基础之上,实现你自己的需求。在了解shell编程之前,先了解shell的背景。

0.1 shell 背景

第一个重要的 shell 是 Bourne shell (如此命名是为了纪念此 shell 的发明者 Steven Bourne), 1979 年第一个流行的 Unix 版本 7 发行时, 开始使用 Bourne shell. Bourne shell 的主档名为 sh, 因此, 日后人们便以 sh 为 Bourne shell 的主要识别名称. 虽然目前Unix 上的 shell 有许多种, 但 Bourne shell 的地位至今仍然没有改变. 许多 Unix 系统中仍然使用 sh 做为重要的管理工具.

第一个广为流行使用的 shell 变种是 C shell. C shell 主要附在 BSD 版的 Unix 系统中. 它的作者是柏克利大学的 Bill Joy. C shell 主要是因为其语法和 C 语言相类似, 因而得名. 这使得 Unix 系统的程式师, 在学习 C shell 时, 感到相当地方便容易.

以上这二种形成 shell 的二大主流, 后来的变种 shell 大都攫取这二种 shell 的优点. 比如 Korn, tcsh 及 bash.

Bash shell 是 GNU 计划的重要工具软体之一, 也是 GNU 作业系统中标准的 shell.Bash 相容于 sh, 因此, 许多早期开发出来的 Bourne shell 都可以继续在 bash 中运作. 现在我们安装好的 Redhat Linux 便是完全使用 Bash. (/bin/sh -> /bin/bash)

Bash 在 1988 年诞生, 最初的作者是 Brian Fox, Chet Ramey 於 1989 加入, 现在官方正式的维护者是 Chet Ramey, 他的工作便是持续不断地增强 bash 的功能. 1995~1996 期间推出 bash 2.0 , 在这之前, 广为使用的版本是 1.14.x, 它增加了许多新的功能, 以及更好的相容性. 当然, Bash 是完全免费的, 它是 Open Source 的一员, 原始码全部开放.

废话少说,很多人喜欢直来直去,那么让你先看看经典的"Hello, World!"

0.2 Hello World!

多么熟悉的字眼啊?用c语言是:

main()
{
printf("Hello, World!\n");
}

用shell会是什么呢?很简单, 你直接在你的提示符输入:

echo "Hello World!";

如果是写在文件hello.sh 中:

#!/bin/sh
#this is the first script
echo "Hello World!";

这么简单还要你讲么?(你要是这都看不懂,那我真是没法讲了) 当然,这只是例行公式。Hello, World嘛,总不能太难。这里需要说明的:

  1. 养成良好的习惯,shell文件以".sh"作为后缀
  2. 注释使用"#"开头
  3. 文本的第一行一定要写成 #!/bin/sh (#!后是你使用shell所在的路径)
  4. 编辑的文本要想让其运行,使用chmod +x hello.sh
  5. 运行程序 ./hello.sh

在shell中,分号';'是用来表示一个命令的结束,同样换行也会表示命令结束。因此,你可以在一行上写几个命令,例如:

#!/bin/sh
cd /home/winter ; echo "Hello World!" ;

再看看下面,我们马上要超越hello world.

0.3 超越Hello World

这个例子好像有些不一般。编辑文件hello2.sh

#!/bin/sh
#hell2.sh -- 用来向用户问好。
if [ $# -ne 1 ] ;
then
echo "Usage: $0 username";
exit 1;
else
echo "Hello World, Hello $1 !";
fi

这把看懂了么?有点意思吧?下面给你解释一下:

  1. [...] 是用来测试。
  2. -ne 表示不等于
  3. if 用于判断,和then else 联合使用,以 fi 结束
  4. $# 表示参数个数
  5. $0 表示脚本名称
  6. $1 表示第一个参数。

总体意思就是:
检测参数,如果没有输入一个名字作为参数,则输出Usage 信息,否则,打印 Hello Word, Hello ursername . 试试输入:($为提示符)

$ chmod +x hello2.sh
$ ./hello2.sh
Usage: hello2.sh username
$ ./hello2.sh Winter
Hello World, Hello Winter!

再看看被某些人称为所谓的奇技淫巧的用法:

$ echo "the resutl is $(( 100 / 25 ))"
the resutl is 4

还有

find ./ -type f -exec chmod 777 {} \;

不要性急,这些只是小菜一碟,更有意思的在后面,先看看本书结构。

0.4 本书结构

本书分成3部分,每部分重点不一样。

第一部分是Shell基础,主要讲Shell命令。如果你对shell命令很是熟悉,这部分你可以先略过,但是awk 和sed 那部分希望你还是好好学习学习。听说awk 和sed 在国外大学都要学一个学期,专门的一门课。

这部分包含6章,基本覆盖了绝大多数shell 命令,每个命令都有详细解释。这部分其实可以作为你 Unix/Linux 常用命令备查手册。我之所以写这么详细,也是希望以后自己能够参考。当然,这里一些系统管理的命令,我并没有详细记录,因为这些对于编程来说,应用稍微少一些。

在第一部分中还重点讲述了awk 和 sed,这是我平时使用最多的两个命令,应该说是工具,如果你要处理文本,他们可真是虎将,不要小瞧。

第二部分开始真正讲解编程了。你要是以前在学校学习过一些计算机语言,哪怕是basic都行,只要你有个概念。shell编程架构并没有太多的特别之处,它的优势在于整合各部分的资源。

这部分主要介绍,循环,条件分枝,命令行参数等,这些是在编程中,构建整个架构的基础。千万不要跟我讲用shell 来面向对象编程,或者范型编程,或许可以,但肯定不是这本书能教给你的。这里的操作是最基本的最简单的,流水线设计和操作。最简单的往往是最稳定的。

第三部分是一些高级主题,前面两部分已经可以让你做很多事情了,如果你希望用shell更多功能,也希望更加炉火纯青,那么你仔细看看第三部分。你会知道如何把Shell当成一种真正的编程语言。这部分主要介绍子函数,shell脚本调试技术和正则表达式等等。

posted on 2008-07-22 10:51  山本二十八  阅读(909)  评论(1编辑  收藏  举报

导航