首页 >> 学习 >> Shell脚本编程基础 >> Shell概述
Shell概述

本节重要性:★★★☆☆    本节难度:★★★☆☆

就像贝类用贝壳将身体最重要的部分包起来一样,Linux shell是包在系统内核外面的一个壳,是连接Linux内核与用户之间的桥梁,是Linux命令的解释程序。也就是说,您敲的命令,都是由Shell解释给系统,系统返回的结果再由Shell显示给用户。同时Shell也是一种高级程序设计语言,有变量、关键字、控制结构和函数。

Shell有如下特点:

1. 利用控制结构(如判断、循环等)和管道将Linux命令组合起来
2. 使用正则表达式
3. 可以直接使用shell内置命令,而无须创建新的进程
4. 灵活使用数据流,提供管道和输入/输出重定向机制,方便数据处理
5. 提供后台执行命令方式
6. 用户可以配置环境

Linux中的shell有多种类型,其中最常用的几种是Bourne shell(sh)、C shell(csh)和Korn shell(ksh)。三种shell各有优缺点。

Bourne shell是UNIX最初使用的shell,并且在每种UNIX上都可以使用。Bourne shell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。Linux操作系统缺省的shell是Bourne Again shell,它是Bourne shell的扩展,简称Bash,与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shell和Korn shell中的优点,有灵活和强大的编程接口,同时又有友好的用户界面。

C shell是一种比Bourne shell更适于编程的shell,它的语法与C语言很相似。Linux为喜欢使用C shell的人提供了Tcsh。Tcsh是C shell的一个扩展版本。Tcsh包括命令行编辑、可编程单词补全、拼写校正、历史命令替换、作业控制和类似C语言的语法,它不仅兼容Bash shell的提示符,而且还提供比Bash shell更多的提示符参数。

Korn shell集合了C shell和Bourne shell的优点并且和Bourne shell完全兼容。Linux系统提供了pdksh(ksh的扩展),它支持任务控制,可以在命令行上挂起、后台执行、唤醒或终止程序。

下面我们看一个Shell脚本的例子。把一些命令写到文件shell_example.sh中:

[peter@ibi98 shell]$ cat shell_example.sh
mkdir animal
cd animal
mkdir bird
touch fox

这个文件可以用sh或bash命令执行,执行完检查目录,会发下目录下多了一个animal目录,该目录下还有一个bird目录和一个fox文件。这与依次单独执行文件里的命令的结果是一样的。

[peter@ibi98 shell]$ sh shell_example.sh
[peter@ibi98 shell]$ ls
shell_example.sh  animal
[peter@ibi98 shell]$ ls animal
bird  fox

一般地,在shell脚本文件的最前面还要加上一行特殊的注释行:#!/bin/bash(不同的Linux发行版或许有差异,要看bash的具体安装位置)。这样写是告诉脚本在以可执行文件方式执行时,shell脚本的解释器在哪里。如下面的例子:

[peter@ibi98 shell]$ cat hello.sh
#!/bin/bash
echo "Hello world!"

shell脚本文件的运行,除了上面的利用sh或bash命令外,还有几种方法,这些方法总结如下:

$ sh bash_script_file 或 $ bash bash_script_file(命令后可以跟参数)
$ sh <bash_script_file 或 $ bash <bash_script_file(命令后不能跟参数)
$ path/bash_script_file [需在脚本文件第一行指定解释器的路径(#!/bin/bash)
	并给该文件添加可执行权限]
$ . bash_script_file 或 $ source bash_script_file(在当前shell下执行脚本中的命令)

最后一种方式是在当前shell下运行脚本文件里的命令,前三种方式新建一个子shell,脚本中的变量赋值并不会影响当前shell。

在常用的Linux发行版如Ubuntu、Fedora、CentOS中,sh是bash的一个符号链接,所以这两个命令都是一样的,最终都是用的bash。

[peter@ibi98 shell]$ ll /bin/sh
lrwxrwxrwx. 1 root root 4 10月 11 2012 /bin/sh -> bash

<<上一节  下一节>>