shellshell编程 编程 -...

85
Shell Shell Shell Shell 编程 编程 编程 编程 讲稿 讲稿 讲稿 讲稿 Version 1.0 Version 1.0 Version 1.0 Version 1.0 Shell Programming Shell Programming Shell Programming Shell Programming 达内 达内 达内 达内 IT IT IT IT 培训集团 培训集团 培训集团 培训集团

Upload: others

Post on 30-May-2020

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

ShellShellShellShell 编程编程编程编程 讲稿讲稿讲稿讲稿

Version 1.0Version 1.0Version 1.0Version 1.0

Shell ProgrammingShell ProgrammingShell ProgrammingShell Programming

达内达内达内达内 ITITITIT培训集团培训集团培训集团培训集团

Page 2: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

修订历史修订历史修订历史修订历史

摘要 日期 修改原因 版本

文档创建 2009-4-10 新建 1.0

PDF 压制 2009-4-22 武汉达内项目部_Charles 压制 1.0

Page 3: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

目录目录目录目录

1.Unix/Linux Shell 介绍........................................................................................................7

目的...............................................................................................................................7

1.技术....................................................................................................................7

2.技能....................................................................................................................7

1.1.Shell 类型................................................................................................................7

1.1.1.什么是 shell ..................................................................................................7

1.1.2.Shell 的两大类型...........................................................................................7

1、Bourne shell (包括 sh, ksh, and bash) ..................................................8

2、C shell (包括 csh and tcsh) ...................................................................8

3、几个 shell 的特别说明 ...............................................................................8

1.2.Shell 与环境 ............................................................................................................9

1.2.1.CSH 环境 ......................................................................................................9

1.2.1.1 系统配置文件:..................................................................................9

1.2.1.2 用户配置文件:..................................................................................9

1.2.2.BASH 环境 ....................................................................................................9

1.2.2.1 系统配置文件 .....................................................................................9

1.2.2.2 用户配置文件 .....................................................................................9

1.2.3.课堂练习 .....................................................................................................10

1.2.4.练习作业 .....................................................................................................11

1.3.Shell 参数..............................................................................................................11

1.3.1.csh 参数 .....................................................................................................11

1.3.2 bash 参数...................................................................................................11

2.Bash Shell 编程基础........................................................................................................13

2.1.第一个简单的 shell 脚本 .......................................................................................13

2.1.1.目的 ............................................................................................................13

2.1.2.知识点说明 .................................................................................................13

2.1.3.案例 ............................................................................................................13

2.1.4.课堂练习 .....................................................................................................14

2.2.输出输入与重定向符号 .........................................................................................15

2.2.1.目的 ..........................................................................................................15

2.2.2.知识点说明 .................................................................................................15

2.2.2.1.输出重定向符号................................................................................15

2.2.2.2.输入重定向符号................................................................................15

2.2.2.3.错误重定向符号................................................................................15

2.2.2.4.关于 IO 重定向与 CSH 的说明..........................................................16

2.2.3.案例 ............................................................................................................16

2.2.4.课堂练习 .....................................................................................................17

2.3.特殊元字符............................................................................................................17

2.3.1.目的 ............................................................................................................17

2.3.2.知识点说明 .................................................................................................17

2.3.3.案例 ............................................................................................................17

Page 4: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.3.4.课堂练习 .....................................................................................................18

2.4.变量与常量............................................................................................................18

2.4.1.目的 ............................................................................................................18

2.4.2.知识点说明 .................................................................................................18

2.4.2.1.变量的定义 ......................................................................................18

2.4.2.2.变量的使用 .......................................................................................19

2.4.2.3.read 与 line 指令 .............................................................................19

2.4.2.4.环境变量...........................................................................................19

2.4.2.5.特殊变量...........................................................................................20

2.4.2.6 export 变量......................................................................................20

2.4.3.案例 ............................................................................................................21

2.4.4.课堂练习 .....................................................................................................22

2.5.引用.......................................................................................................................22

2.5.1.目的 ............................................................................................................22

2.5.2.知识点说明 .................................................................................................23

2.5.2.1.单引号 ..............................................................................................23

2.5.2.2.双引号 ..............................................................................................23

2.5.2.3. ` 命令引用号...................................................................................23

2.5.3.案例 ............................................................................................................23

2.5.4.课堂练习 .....................................................................................................23

2.6.数组.......................................................................................................................24

2.6.1.目的 ............................................................................................................24

2.6.2.知识点说明 .................................................................................................24

2.6.3.案例 ............................................................................................................24

2.6.4.课堂练习 .....................................................................................................25

2.7.运算符号 ...............................................................................................................26

2.7.1.目的 ............................................................................................................26

2.7.2.知识点说明 .................................................................................................26

2.7.3.案例 ............................................................................................................28

2.7.4.课堂练习 .....................................................................................................30

2.8.判定分支 ...............................................................................................................31

2.8.1.目的 ............................................................................................................31

2.8.2.知识点说明 .................................................................................................31

2.8.2.1.使用 if 判定分支................................................................................31

2.8.2.2.一般测试...........................................................................................32

2.8.2.3.文件测试...........................................................................................32

2.8.2.4.BASH 选项测试.................................................................................32

2.8.2.5.退出状态码与 true|false 指令.........................................................33

2.8.2.6.case 语句 ........................................................................................33

2.8.2.7.嵌套 if ...............................................................................................34

2.8.3.案例 ............................................................................................................34

2.8.4.课堂练习 .....................................................................................................37

2.9.循环.......................................................................................................................38

2.9.1.目的 ............................................................................................................38

Page 5: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.9.2.知识点说明 .................................................................................................38

2.9.2.1. for 循环语法 ....................................................................................38

2.9.2.2.while 循环语法.................................................................................38

2.9.2.3.until 循环语法...................................................................................39

2.9.2.4.continue 与 break 使用..................................................................39

2.9.2.5.select 语法(选) ................................................................................39

2.9.2.6.shift 语法(选) ....................................................................................40

2.9.3.案例 ............................................................................................................40

2.9.4.课堂练习 .....................................................................................................43

2.10.函数.....................................................................................................................44

2.10.1.目的 ..........................................................................................................44

2.10.2.知识点说明 ...............................................................................................44

2.10.2.1.函数语法.........................................................................................44

2.10.2.2.函数的参数与返回值 ......................................................................45

2.10.2.3.函数嵌套与特殊用法 ......................................................................45

2.10.2.4.函数与重定向 .................................................................................46

2.10.2.5.变量与函数 .....................................................................................47

2.10.3.案例 ..........................................................................................................47

2.10.4.课堂练习 ...................................................................................................50

2.11.子 shell................................................................................................................50

2.11.1.目的 ..........................................................................................................50

2.11.2.知识点说明 ...............................................................................................51

2.11.2.1.子 SHELL 调用方式..........................................................................51

2.11.2.2.子 SHELL 调用说明..........................................................................51

2.11.2.3.受限 SHELL 脚本 .............................................................................52

2.11.3.案例 ..........................................................................................................52

2.11.4.课堂练习 ...................................................................................................53

2.11.5.思考与提高 ...............................................................................................53

2.12.内建命令 .............................................................................................................53

2.12.1.目的 ..........................................................................................................53

2.12.2.知识点说明 ...............................................................................................54

2.12.3.案例 ..........................................................................................................61

2.12.4.课堂练习 ...................................................................................................62

2.12.命令与程序..........................................................................................................62

2.12.1.目的 ..........................................................................................................62

2.12.2.知识点说明 ...............................................................................................62

2.12.2.1.基本命令.........................................................................................62

2.12.2.2.高级命令.........................................................................................63

2.12.2.3.时间/日期命令................................................................................63

2.12.2.4.文本处理命令 .................................................................................63

2.12.2.5.文件与归档命令..............................................................................64

2.12.2.6.通讯命令.........................................................................................65

2.12.2.7.终端控制命令 .................................................................................65

2.12.2.8.数学计算命令 .................................................................................66

Page 6: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.12.2.9.其他命令.........................................................................................66

2.12.3.案例 ..........................................................................................................66

2.12.4.课堂练习 ...................................................................................................66

2.13.命令与进程替换 ..................................................................................................67

2.13.1.目的 ..........................................................................................................67

2.13.2.知识点说明 ...............................................................................................67

2.13.2.1.命令替换.........................................................................................67

2.13.2.2.进程替换.........................................................................................67

2.13.3.案例 ..........................................................................................................68

2.13.4.课堂练习 ...................................................................................................68

3.Bash Shell 编程高级应用 ................................................................................................69

3.1.grep 与正则表达式...............................................................................................69

3.2.SED 流编辑............................................................................................................72

3.3.gawk 调用 ............................................................................................................72

3.4.Shell 扩展..............................................................................................................73

附录 ....................................................................................................................................74

BASH 系统环境变量参考.............................................................................................74

1.保留的 Bourne shell 变量 ...............................................................................74

2. Bash 保留变量 .................................................................................................74

PS 特殊转义字符 .........................................................................................................77

BASH 转义字符 ...........................................................................................................78

内建命令(补充) ...........................................................................................................78

printf....................................................................................................................78

Page 7: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

1.Unix/Linux Shell介绍介绍介绍介绍

目的目的目的目的

1.1.1.1.技术技术技术技术

1.1 了解 SHELL 类型与 SHELL 的发展历史。

1.2 了解 BASH 与 CSH 的参数。

1.3 了解登入/登出 SHELL 要执行的相关文件。

2222....技能技能技能技能

1. 登入/登出 Unix 系统

2. 查看环境变量

3. 根据需要修改配置 SHELL 登录相关文件

1.1.Shell 类型类型类型类型

1.1.1.什么是什么是什么是什么是 shell

字符操作系统与外部最主要的接口就叫做 shell。shell 是操作系统最外面的一层。

shell 管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各

种各样的操作系统的输出结果。

shell 提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,

并且可以立即得到响应),或者以 shell script(非交互)方式执行。shell script 是放在

文件中的一串 shell 和操作系统命令,它们可以被重复使用。本质上,shell script 是命

令行命令简单的组合到一个文件里面。

Shell 基本上是一个命令解释器。

1.1.2.Shell的的的的两两两两大类型大类型大类型大类型

在 UNIX 中主要有两大类 shell :

Page 8: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

1、、、、Bourne shell (包括包括包括包括 sh, ksh, and bash)

最初的UNIX shell是由Stephen R. Bourne于 20世纪70年代中期在新泽西的AT&T

贝尔实验室编写的,这就是 Bourne shell。

Bourne shell 是一个交换式的命令解释器和命令编程语言。Bourne shell 可以运

行为 login shell 或者 login shell 的子 shell(subshell)。只有 login 命令可以调用

Bourne shell 作为一个 login shell。此时,shell 先读取/etc/profile 文件和

$HOME/.profile 文件。/etc/profile 文件为所有的用户定制环境,$HOME/.profile 文

件为本用户定制环境。最后,shell 会等待读取你的输入。

Bourne shell ( sh)

Korn shell ( ksh)

Bourne Again shell ( bash)

POSIX shell ( sh)

2、、、、C shell (包括包括包括包括 csh and tcsh)

Bill Joy 于 20 世纪 80 年代早期,在 Berkeley 的加利福尼亚大学开发了 C shell。

它主要是为了让用户更容易的使用交互式功能,并把 ALGOL 风格的语法结构变成了

C 语言风格。 它新增了命令历史、别名、文件名替换、作业控制等功能。

C shell ( csh)

TENEX/TOPS C shell ( tcsh)

说明说明说明说明::::Shell 的程序在/bin/目录下

� /bi/bi/bi/bin/shn/shn/shn/sh

� /bin/ksh/bin/ksh/bin/ksh/bin/ksh

� /bin/bash/bin/bash/bin/bash/bin/bash

� /bin/csh/bin/csh/bin/csh/bin/csh

� /bin/tcsh/bin/tcsh/bin/tcsh/bin/tcsh

3、、、、几个几个几个几个 shell 的特别说明的特别说明的特别说明的特别说明

·Korn Shell

有很长一段时间,只有两类 shell 供人们选择,Bourne shell 用来编程,C shell

用来交互。为了改变这种状况,AT&T 的 bell 实验室 David Korn 开发了 Korn shell。

ksh结合了所有的C shell的交互式特性,并融入了Bourne shell的语法。因此,Korn

shell 广受用户的欢迎。它还新增了数学计算,进程协作(coprocess)、行内编辑

(inline editing)等功能。Korn Shell 是一个交互式的命令解释器和命令编程语言.

它符合 POSIX

说明说明说明说明::::[POSIX 是一个操作系统的国际标准,POSIX 不是一个操作系统,而是一个目标在

于应用程序的移植性的标准——在源程序一级跨越多种平台]

·Bourne Again Shell (bash)

Page 9: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

bash 是 GNU 计划的一部分,用来替代 Bourne shell。它用于基于 GNU 的系统如

Linux.大多数的 Linux(Red Hat, Slackware, Caldera,Suse)都以 bash 作为缺省的

shell,并且运行 sh时,其实调用的是 bash。

·POSIX Shell

POSIX shell 是 Korn shell 的一个变种. 当前提供 POSIX shell 的最大卖主是

Hewlett-Packard。在 HP-UX 11.0 , POSIX shell 就是/bin/sh,而 bsh 是

/usr/old/bin/sh.

说明说明说明说明::::各主要操作系统下缺省的 shell:

AIX 下是 Korn Shell.

Solaris 和 FreeBSD 缺省的是 Bourne shell.

HP-UX 缺省的是 POSIX shell.

Redhat Linux 是 Bourne Again shell.

1.2.Shell 与环境与环境与环境与环境

不管用户使用什么 shell 做为登录的缺省 shell,登录都需要事先执行一些脚本文件。

1.2.1.CSH环境环境环境环境

1.2.1.1 系统配置文件系统配置文件系统配置文件系统配置文件::::

/etc/.login

1.2.1.2 用户配置文件用户配置文件用户配置文件用户配置文件::::

$HOME/.login

$HOME/.cshrc

1.2.2.BASH环境环境环境环境

1.2.2.1 系统配置文件系统配置文件系统配置文件系统配置文件

/etc/profile

1.2.2.2 用用用用户配置文件户配置文件户配置文件户配置文件

$HOME/.bash_login

$HOME/.profile

Page 10: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

$HOME/.bash_profile

1.2.3.课堂练习课堂练习课堂练习课堂练习

1.使用 man 查看 csh 帮助。

操作:输入 man csh

显示:

2.使用 ls -a 查看$HOME 下是否有.cshrc 与.login 文件存在。

操作:输入 ls –a

显示:

3.新增或修改.cshrc 和.login 文件。

修改.cshrc。

操作:输入 vi .cshrc

修改.login。

操作:输入 vi .login

Page 11: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

4.重新登录体会两个文件执行的先后顺序。

操作

5.思考

1.把.cshrc 与.login 文件内容交换再操作一遍,体会两个文件的执行顺序。

2.可以在.cshrc 中输入 echo 1,在.login 输入 echo 2,重新登录,根据输出的先

后顺序可以很容易知道先后顺序。

6.提高

当.cshrc 文件执行错误,.login 文件不会再执行。

1.2.4.练习作业练习作业练习作业练习作业

1、仿照课堂练习的步骤,在 Linux 系统下增加登录初始化文件,并登录体会每个用户

级别初始化文件的加载顺序,以及文件执行错误后面文件是否正常执行。

[练习目的:体会 BASH 做为登入 SHELL 的初始化文

件 .bash_login、 .profile、 .bash_profile 执行顺序]

[提示:执行顺序是]

1.3.Shell 参数参数参数参数

1.3.1.csh参数参数参数参数

语法语法语法语法::::

csh [-befHinstvVxX] [-c [script]] [arg ...]

1.3.2 bash参数参数参数参数

语法语法语法语法::::

Page 12: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

bash [bash_options] -s [±abCefGHhiKkLmNnPprtuvwXx] [±o option] [-d directory]

[-R name, env_piece, cmds] [argument...]

bash_optionbash_optionbash_optionbash_option 说明说明说明说明::::

--------login login login login

先执行.bash_login 文件.

--------initinitinitinit----file file file file file file file file

--------rcfile file rcfile file rcfile file rcfile file

在交互模式下,替代($HOME/.bashrc)去执行指定的文件

--------noprofile noprofile noprofile noprofile

不执行搜索并如下文件

$ROOTDIR/etc/profile.ksh

$HOME/.bash_profile

$HOME/.bash_login

$HOME/profile.ksh

$HOME/.profile

--------norc norc norc norc

在交互模式下不执行$HOME/.bashrc 文件

--------restricted restricted restricted restricted

等价-r 选项

--------verbose verbose verbose verbose

等价-v 选项

--------version version version version

显示版本信息

Page 13: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.Bash Shell编程编程编程编程基础基础基础基础

2.1.第一个简单的第一个简单的第一个简单的第一个简单的 shell 脚本脚本脚本脚本

2.1.1.目的目的目的目的

技术

1、执行 shell 脚本。

2、使用指定的 shell 执行 shell 脚本。

3、注释

4、语句结束符号

技能

1、 能使用一种编辑工具正确编写 shell 脚本,并执行。

2、 能根据需要在 shell 脚本中指定 shell 类型。

2.1.2.知识点说明知识点说明知识点说明知识点说明

1、执行 shell 脚本。

Shell 脚本如果正确并且对当前用户有执行权限的话,可以像执行一般程序

那样执行,就是直接在命令行输入 shell 脚本名执行,或者在可视窗体中点击执行。

但在某些特殊情况下可以采用其他的执行方式。

a. exec shell 脚本名

b. source shell 脚本名

具体的区别在后面讲子 shell 的时候解释。

3、 指定 shell 类型。

a. 在命令行指定。

Shell 名 shell 脚本名。

b. 在 shell 脚本中指定。

语法:#!shell 路径与文件

例子:#!/bin/bash

4、 注释。

# 注释内容

5、 语句结束符号。

语句结束符号两种方式:分号结束或者直接换行

2.1.3.案例案例案例案例

1、编写 shell 脚本。

Page 14: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

方法一:使用 telnet 或其他终端登录工具登录,并使用 vi 编辑脚本。

方法二:使用 UltraEdit 工具本地编辑,并 FTP 保存倒 Unix 服务器。

2、确保脚本的执行权限。

chmod o+x shell 脚本文件名

3、使用登录 shell 执行 shell 脚本。

方法一:在命令行直接输入 shell 脚本文件名并回车执行。

方法二:exec shell 脚本文件名。

方法三:source shell 脚本文件名。

体会 exec 与 source 的区别,详细的说明见后面内容。

4、在命令行指定 shell 执行 shell 脚本。

bash shell 脚本文件名。

或者

csh shell 脚本文件名。

5、在 shell 脚本中指定 shell 执行 shell 脚本。

#!/bin/csh。

或者

#!/bin/bash 。

在其中还可以指定 shell 的参数。详细说明见后面内容。

2.1.4.课堂练习课堂练习课堂练习课堂练习

练习一

1、目的

上面的练习不能体会到底是否是那种 shell 在执行,这个练习中我们专门设计

csh 与 bash 语法上不同的两个语句,来体会指定的 shell 确实在起作用。

2、准备知识

在 csh 中定义变量的语法:setenv 变量名 变量值。

在 bash 中定义变量的语法:变量名=变量值。

3、实施

编写 shell,内容定义 bash 格式的变量,但指定的 shell 类型是 csh。然后执

行并体会。反之再操作一遍。最后提供正确的 shell 类型,并保证两个 shell 能正确执行。

练习二

写 bash 脚本打印如下图形。

********************************************

* *

* 达内 IT 培训集团 *

* *

********************************************

练习三

给上面 shell 脚本添加注释。

Page 15: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.2.输出输出输出输出输入输入输入输入与重定向与重定向与重定向与重定向符号符号符号符号

2.2.1.2.2.1.2.2.1.2.2.1.目的目的目的目的

技术

1、 bash 的输出输入重定向符号类型。

2、 bash 的输出输入重定向符号的作用。

技能

1、能根据需要正确选择并使用输出重定向符号。

2.2.2.知识点说明知识点说明知识点说明知识点说明

2.2.2.1.输出重定向符号输出重定向符号输出重定向符号输出重定向符号

1、输出重定向(如果该文件已存在,将被覆盖):

指令 > file

2、输出重定向,内容追加到文件:

指令>> file

2.2.2.2.输入重定向符号输入重定向符号输入重定向符号输入重定向符号

1、输入重定向:

指令 < file

2、输入重定向(结束输入时,结束行输入 END),此模式将对输入内容进行 shell

变量替换:

指令 <<END

说明说明说明说明::::bash 使用>提示符而 csh 使用?作提示符

3、输入重定向(结束输入时,结束行输入 END),此模式将对输入内容不做 shell

变量替换:

指令 <<\END

说明说明说明说明::::bash 使用>提示符而 csh 使用?作提示符

2.2.2.3.错误错误错误错误重定向符号重定向符号重定向符号重定向符号

1、错误重定向

指令 2> 文件

Page 16: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2、错误输出与输出重定向

指令 &> 文件 或者

指令 >& 文件 或者

指令 >文件 2>&1

2.2.2.4.关于关于关于关于 IO 重定向与重定向与重定向与重定向与 CSH 的说明的说明的说明的说明

1、在 Unix 系统中,标准输入、标准输出、标准错误输出都有对应的文件描述符

号,分别是 0、1、2。

2、在整个课程中为了避免混淆,我们一致使用 BASH 做为主要的讲解。但其他 SHELL

对应的知识点可以参考对应 SHELL 的帮助。请使用 man 工具获取。

2.2.3.案例案例案例案例

1、切换到 bash 命令行。

操作:在命令行直接输入 bash

2、bash 的小技巧

a.tab 键的智能提示作用

b.方向键↑显示历史命令记录

3、练习输出重定向

把查看的目录清单输出到文件。

ls -l >1.txt

ls -l >>1.txt

4、练习输入重定向

使用 cat 与输入从定向显示文件。

cat < 1.txt

显示输出键盘输入

echo <<ok

5、练习错误重定向

查找某个文件,使用错误重定向保证不输出错误。

find / -name 1.txt 2>/dev/null

查找某个文件,把查找输出与错误输出到文件

find / -name 1.txt &>result.txt

Page 17: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.2.4.课堂练习课堂练习课堂练习课堂练习

练习一

编写一个 shell 脚本,查找用户主目录下的三天前的文件,并把清单输出到某

个文件中。

2.3.特殊特殊特殊特殊元元元元字符字符字符字符

2.3.1.目的目的目的目的

技术

1、 了解 BASH 中支持的所有元字符。

2、 掌握 BASH 中元字符的含义与使用。

技能

1、能根据需要使用元字符。

2.3.2.知识点说明知识点说明知识点说明知识点说明

其面介绍的# 、#!、>、>>、<、<<都是特殊的元字符,在 SHELL 脚本中都有特定的含

义与作用。在 BASH 中还有很多这样的字符。下面表格列出大部分元字符及其作用描述。

元字符 作用 例子

$ 取变量值 $SHELL 或者${SHELL}

! 取历史指令 !3 执行历史指令中的第三个指令

* N 个字符占位符 rm * 删除所有文件

? 1 个字符占位符 rm a? 删除 a 开头两个字符文件名的文

& 保证指令在后台执行 find / -name 1.txt&

() 在子 shell 中执行一组指令 (ls -l;pwd)>1.txt

\ 禁用元字符,就是转移符 \#

[ ] 含义有多种:占位,条件测试 [a-z]a-z 的所有字符 [ 4=2 ]

~ 用户主目录

| 管道符号 ls | wc

{} 占位符号,一组字符 ls {dir1,dir2}

上面已经讲述过的元字符没有列入。某些元字符会在后面补充讲解。

2.3.3.案例案例案例案例

#!/bin/bash

#说明元字符的使用

Page 18: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

# 下面注意其中空格有无的作用

echo Hello \#是注释 ?

find . -name "*.txt" -exec rm -f {} \;

2.3.4.课堂练习课堂练习课堂练习课堂练习

练习一

写一个脚本完成如下任务,查找用户主目录下的所有三天前的文本文件,并把文件权

限改为对所有用户只读。

2.4.变量与常量变量与常量变量与常量变量与常量

2.4.1.目的目的目的目的

技术

1、定义变量。

2、使用变量。

3、常量(只读变量)。

4、系统保留变量。

5、特殊变量

技能

1、 能根据需要定义合适的变量,并显示变量的值。

2、 能从键盘接受变量的值。

3、 能从文件读入变量的值。

4、 能给 shell 脚本传递参数,并处理参数。

2.4.2.知识点说明知识点说明知识点说明知识点说明

2.4.2.1....变量的变量的变量的变量的定义定义定义定义

1、方法一

语法:变量名=变量值

例子:var=123

说明:SHELL 脚本中本身是没有数据类型的,所以不需要指定类型。

2、方法二

语法:declare [+/-][rxipat][变量名称=设置值] 或 declare –f

例子:declare var=ShellProgramming

说明:

Page 19: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

declare 为 shell 指令,在第一种语法中可用来声明变量并设置变量的

属性([rix]即为变量的属性),

在第二种语法中可用来显示 shell 函数。若不加上任何参数,则会显示

全部的 shell 变量与函数(与执行 set 指令的效果相同)。

参数:

+/- "-"可用来指定变量的属性,"+"则是取消变量所设的属性。

-f 仅显示函数。

r 将变量设置为只读。

x 指定的变量会成为环境变量,可供 shell 以外的程序来使用。

i [设置值]可以是数值,字符串或运算式。

p 显示每个变量的属性和值。当使用 -p 选项,其他选项就被忽略。

a 变量为数组。

t 给于每个变量 trace 属性。

数组参数后面有专门的说明。

Typeset 是相同作用,但 declare 在 bash2.0 中引入的内建命令。

2.4.2.2.变量的使用变量的使用变量的使用变量的使用

语法:${变量名}

说明:在不产生歧义的情况下,{}可以省略。

例子:echo $var1

2.4.2.3.read 与与与与 line 指令指令指令指令

1、read

语法:read [-rep] var...

说明:读取一个数据

例子:read aa

参数:-r 表示 return 键结束

没有-r参数,用\表示续行符号

-e 表示使用 vi 编辑。

-p 表示提示

2、line

语法:line

说明:读取一行

例子:line

2.4.2.4.环境变量环境变量环境变量环境变量

Unix 操作系统定义了很多自己使用得环境变量,用户可以修改某些变量,来定值

一些独特得作用。

PATH 环境变量 :执行文件搜索路径。路径使用:分隔。

Page 20: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

PS1 与 PS2 环境变量 :提示符号。

LINENO 环境变量 :SHELL 脚本的代码行数。

BASH_VERSINFO 环境变量 :SHELL 的版本信息,是数组。

BASH_VERSION 环境变量 :SHELL 的版本。

GROUPS 环境变量 :用户所在的组。

HOSTNAME 环境变量 :主机名。

OLDPWD 环境变量 :老工作目录。

OSTYPE 环境变量 :操作系统类型。

PWD 环境变量 :当前工作路径。

SECONDS 环境变量 :SHELL 执行的秒数。

SHLVL 环境变量 :SHELL 的层数。

HOME 环境变量 :用户主目录。

SHELL 环境变量 :登录 SHELL 类型。

PROMPT_COMMAND 环境变量 :指令执行完毕后的提示指令。

MACHTYPE 环境变量 :机器类型。

2.4.2.5.特殊变量特殊变量特殊变量特殊变量

字符字符字符字符 定义定义定义定义

$* 位置参数,从 1开始。当扩展发生在双引号时,它展开成一个单独的词,每个参

数的值由 IFS 特殊变量的第一个字符分隔。

$@ 位置参数,从 1开始。当在双引号里展开时,每个参数展开成独立的词。

比如:$1表示第一个参数。

$# 位置参数个数。

$? 展开成最近执行的前台管道程序的退出状态。

$- 一个连字符展开为当前选项标志内部命令集 或者那些 shell 自己的集(如-i)。

$$ shell 的进程 ID。

$! 展开成最近在后台(异步)执行的命令的进程 ID。

$0 展开成 shell 或者 shell 脚本名。

$_

下划线变量在 shell 启动时设置,包含 shell 的绝对文件名或者作为参数列表被

执行的脚本。随后,它展开为前一个命令扩展后的最后一个参数。它同样设置 为

每个执行程序的全路径,放在那个命令的输出环境中。当检查邮件时,这个参数

保存邮件文件的名字。

灰蓝色部分不需要理解。

2.4.2.6 export 变量变量变量变量

在 BASH 中导出环境变量需要使用 export。效果等同于 declare -x。

语法:export 变量名 1变量名 2 ……

Page 21: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.4.3.案例案例案例案例

案例一

体会 declare –r var 只读变量

#!/bin/bash

#说明简单变量的使用

#注意变量名与=间的空格

var1=hello

echo $var1

declare -ixr var2=2+3

echo $var2

var2=7+7

echo $var2

declare -f

#declare

案例二

体会 PS1 变量的使用

#!/bin/bash

#说明系统变量的使用

echo ${LINENO}

PS1="\h\t\!"

echo $PATH

案例三

体会 $ 的使用

#!/bin/bash

#说明系统变量的使用

echo $*

echo $@

echo $#

echo $?

echo $-

echo $$

Page 22: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

echo $!

echo $0

echo $_

案例四(综合案例)

写一个脚本删除指定目录下的文本文件,要求只需要指定目录。

#!/bin/bash

#说明系统变量的使用

rm -rf $1/*.txt

案例五

输入两个整数,打印他们的和。

#!/bin/bash

#说明引用的使用

read a

read b

declare -i c=$a+$b

echo "a + b= $c"

2.4.4.课堂练习课堂练习课堂练习课堂练习

课堂练习一

写一个脚本查看某个目录下的文本文件。

课堂练习二

写一个脚本把 UNIX 提示符号设置成自己喜欢的样式。

课堂练习三

修改系统初始化文件,把命令行提示符号修改成自己喜欢的样式。

课堂练习四

写一个脚本把指定目录下的 sh文件权限修改成可执行。

课堂练习五

修改系统初始化文件,把工作目录设置成 PATH。

2.5.引引引引用用用用

2.5.1.目的目的目的目的

技术

1.掌握单引号的作用。

2.掌握双引号的作用。

技能

Page 23: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

1.能根据需要熟练使用引用符号 ” 与 ’ 。

2.5.2.知识点说明知识点说明知识点说明知识点说明

2.5.2.1.单引号单引号单引号单引号

单引号('')用于保持在引号内的每个字符的字面值。

2.5.2.2.双引号双引号双引号双引号

使用双引号保持引号内的所有字符的字面值,除了$,` `,\。

2.5.2.3. ` 命令引用命令引用命令引用命令引用号号号号

命令替换符号

2.5.3.案例案例案例案例

考虑引用与转义符号等的使用。

#!/bin/bash

#说明引用的使用

myvar=2334

echo ${myvar}

echo "${myvar}"

echo '${myvar}'

echo "${myvar}'${myvar}'"

echo '${myvar}"${myvar}"'

echo "$*"

2.5.4.课堂练习课堂练习课堂练习课堂练习

Page 24: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.6.数组数组数组数组

2.6.1.目的目的目的目的

技术

1. 掌握数组的定义

2. 掌握数组的使用

技能

1. 能根据需要熟练使用数组

2.6.2.知识点说明知识点说明知识点说明知识点说明

2.6.2.1.建立数组

数组是一个包含多个值的变量。任何变量都可以在数组中使用。数组的尺寸没有最大限

制,也不要求成员变量连续索引或者赋值。数组是基于 0的:第一个元素的下标以 0 开始。

语法一:ARRAY[INDEXNR]=value

说明:INDEXNR 需要使用一个值为正数的数学表达式。

语法二:declare -a ARRAYNAME

说明:一个带有索引值的声明也是可以接受的,但是索引值将被忽略。

语法三:ARRAY=(value1 value2 ... valueN)

说明:每个值将以这种形式 [indexnumber=]string 排列。索引号是可选的。

如果提供,索引号就赋给它

特殊说明:read 内建命令提供 -a 选项,来允许对一个数组的成员变量进行读取和赋

值。

2.6.2.2.使用数组

为了指明在一个数组中的项目的内容,为了指向一个数组中的一个项目的内容,使用{}。

语法:数组名[索引]

说明:*,@指向所有的数组内容。

2.6.2.3.删除数组

语法:unset 数组名

2.6.3.案例案例案例案例

案例一 数组的基本使用

#!/bin/bash

#说明数组的使用

#第一种数组定义方式与访问

arr[1]=20;

arr[2]=30;

Page 25: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

echo ${arr[*]}

echo $arr[*]

#第二种数组定义方式与访问

declare -a arr2

arr2[1]=20

arr2[2]=20

echo ${arr2[*]}

#第三种数组定义方式与访问

arr3=(hello shell programming)

echo ${arr3[*]}

#数组的删除

unset arr3

echo ${arr3[*]}

案例二 数组的输入

#!/bin/bash

#说明数组的使用

#第一种数组定义方式与访问(请参数-a 体会)

read -a arr

echo ${arr[0]}

echo ${arr[*]}

2.6.4.课堂练习课堂练习课堂练习课堂练习

见后面流控制部分

Page 26: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.7.运算符号运算符号运算符号运算符号

2.7.1.目的目的目的目的

技术

1. 掌握变量的长度运算

2. 掌握变量的替换运算

3. 掌握变量的基本算术运算

4. 掌握位运算

5. 掌握逻辑运算

6. 掌握比较运算

技能

1. 能熟练对数据进行各种运算

2.7.2.知识点说明知识点说明知识点说明知识点说明

2.7.2.1.长度运算

语法:${#变量名}

说明:返回变量得字符个数

2.7.2.2.替换运算

语法:${变量:- 变量或值}

${变量:= 变量或值}

${变量:+ 变量或值}

${变量:? 消息提示}

说明:- 如果变量不存在,则返回-后面的值。

= 如果变量不存在,则返回=后面的值,并且创建变量,其值为=后的值。

+ 如果变量存在,则返回+后面的值。

? 如果变量不存在,则终止并打印消息提示。

2.7.2.3.字符串处理运算

语法:取子串 ${字符串:n1:n2}

删除字符串 ${数组#匹配模式} 返回匹配前字符串

${数组##匹配模式} 返回删除匹配字符串部分后得字符串

删除末尾 ${字符串%匹配模式} 返回去掉匹配尾巴后的字符串

${字符串%%匹配模式}

替换匹配 ${字符串/匹配模式/替换字符串} 替换第一个

${字符串/匹配模式/替换字符串} 替换所有

2.7.2.4.算术运算、逻辑运算、位运算、比较运算

以下所有运算使用如下运算替换语法:$(()) $[] 或者 let 命令

操作符操作符操作符操作符 意义意义意义意义

Page 27: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

操作符操作符操作符操作符 意义意义意义意义

VAR++ and VAR-- 变量自增和变量自减

++VAR and --VAR 变量前置加和前置减

- and + 一元减和加

! and ~ 逻辑和按位取反

** 求幂

*, / and % 乘,除,求余

+ and - 加,减

<< and >> 左移和右移

<=, >=, < and > 比较操作符

== and != 相等和不相等

& 位与

^ 位异或

| 位或

&& 逻辑与

|| 逻辑或

expr ? expr : expr 条件赋值

=, *=, /=, %=, +=, -=, <<=, >>=, &=, ̂ = and

|= 赋值

, 表达式间的分隔符

注意:++、+=等运算符号是对变量的,不是字面值。

SHELL 中对浮点数得运算支持不是很好。可以使用其他工具完成。后面有简单介绍。

2.7.2.4. 测试与比较条件

语法:[ ] 或者 [[ ]]

1、 比较

操作符操作符操作符操作符 意义意义意义意义

-eq 等于

-gt 大于

-ge 大于等于

-lt 小于

-le 小于等于

-ne 不等

2、 测试

3、 主表达式主表达式主表达式主表达式

语法语法语法语法 意义意义意义意义

[ -a FILE ] 如果 FILE 存在则为真。

[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。

[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。

[ -d FILE ] 如果 FILE 存在且是一个目录则为真。

[ -e FILE ] 如果 FILE 存在则为真。

Page 28: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

语法语法语法语法 意义意义意义意义

[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。

[ -g FILE ] 如果 FILE 存在且已经设置了 SGID 则为真。

[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。

[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。

[ -p FILE ] 如果 FILE 存在且是一个名字管道(F 如果 O)则为真。

[ -r FILE ] 如果 FILE 存在且是可读的则为真。

[ -s FILE ] 如果 FILE 存在且大小不为 0 则为真。

[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。

[ -u FILE ] 如果 FILE 存在且设置了 SUID (set user ID)则为真。

[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。

[ -x FILE ] 如果 FILE 存在且是可执行的则为真。

[ -O FILE ] 如果 FILE 存在且属有效用户 ID 则为真。

[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。

[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。

[ -N FILE ] 如果 FILE 存在并且最后读取以后被修改。

[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。

[ FILE1 -nt FILE2 ] 如果 FILE1 比 FILE2 新为真。

[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存

在则为真。

[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。

[ -o OPTIONNAME ] 如果 shell 选项 “OPTIONNAME” 开启则为真。

[ -z STRING ] “STRING” 的长度为零则为真。

[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero 则为真。

[ STRING1 == STRING2 ] 如果 2个字符串相同。

[ STRING1 != STRING2 ] 如果字符串不相等则为真。

[ STRING1 < STRING2 ] 字典序比较

[ STRING1 > STRING2 ] 字典序比较

[ ARG1 OP ARG2 ] “OP” 是 -eq, -ne, -lt, -le, -gt or -ge.

[ ! EXPR ] 如果 EXPREXPREXPREXPR 是 false 则为真。

[ ( EXPR ) ] 返回 EXPREXPREXPREXPR 的值。这样可以用来忽略正常的操作符优先

级。

[ EXPR1 -a EXPR2 ] 如果 EXPR1EXPR1EXPR1EXPR1 and EXPR2EXPR2EXPR2EXPR2 全真则为真。

[ EXPR1 -o EXPR2 ] 如果 EXPR1EXPR1EXPR1EXPR1 或者 EXPR2EXPR2EXPR2EXPR2 为真则为真。

2.7.3.案例案例案例案例

案例一

Page 29: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

#!/bin/bash

#说明运算符号的使用

arr=(1 2 3 4)

a=hello

echo ${#a}

echo ${#arr}

echo ${#arr[*]}

echo ${a:-shell}

echo ${b:-${a}}

echo ${b:-不存在}

b=存在

echo ${b:-不存在}

echo ${b:=不存在}

echo ${c:=c 不存在}

echo ${c:=c 还是不存在}

#$(())算术运算

s1=$((1+3+4))

echo $s1

v=20

echo $((v>10))

echo $((v++))

echo $v

echo $((v**2))

echo $[v**2]

Page 30: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

let d=v**2

echo $d

let "t2 = ((t1 = 9, 15 / 3))" #t2=5 t1=9

echo $t2 $t1

#进制

let t3=023

let t4=0xff

let t5=2#10101

echo $t3 $t4 $t5

echo $((t6=023,16/4))

#比较运算

#注意[ ]之间的空格

[ "3" -ne "4" ]

[[ "3" -gt "4" ]]

案例二

#!/bin/bash

#说明字符运算符号的使用

str="hello shell programming"

echo ${str:5}

echo ${str:5:5}

arr=(hello shell programming)

echo ${arr[*]##p*}

echo ${str%%pro*}

2.7.4.课堂练习课堂练习课堂练习课堂练习

1、输入两个数计算他们的和。(不要求浮点数)

2、输入一个复杂表达式,打印结果。

Page 31: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.8.判定判定判定判定分支分支分支分支

2.8.1.目的目的目的目的

技术:

1. 掌握 if 语句的语法

2. 掌握嵌套 if

3. 掌握 case 语句的语法

4. 掌握 true 内部指令

技能:

1.能熟练使用判定分支控制 shell 脚本的流程。

2.8.2.知识点说明知识点说明知识点说明知识点说明

2.8.2.1.使用使用使用使用 if 判定分支判定分支判定分支判定分支

语法一:

if 条件表达式

then

……

fi

语法二:

if 条件表达式

then

……

else

……

fi

语法三:

if 条件表达式

then

……

elif 条件表达式

then

……

else

……

fi

Page 32: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.8.2.2.一般测试一般测试一般测试一般测试

1.利用(())与进行比较运算

例如:((var))或者((表达式))

2.利用[ ]进行测试

例如:[ 测试条件 ]

2.8.2.3.文件测试文件测试文件测试文件测试

参考运算符号部分

2.8.2.4.BASH 选项测试选项测试选项测试选项测试

使用 set –o 可以查看某些选项的关闭

-o 选项名 就是判定某些选项是否开闭。如下操作:

使用 set –o 选项 on/off 进行操作

Page 33: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.8.2.5.退出状态码与退出状态码与退出状态码与退出状态码与 true|false 指令指令指令指令

$?返回当前 shell 与指令执行后的状态码。在 SHELL 脚本中可以使用 exit 状态码在脚

本结束的时候指定运行状态码。

修改状态码使用 true 与 false 指令。操作如下:

2.8.2.6.case 语句语句语句语句

语法:

case "$variable" in

值 1 )

......

;;

值 2 )

......

;;

Esac

说明:对变量使用""并不是强制的。

Page 34: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.8.2.7.嵌套嵌套嵌套嵌套 if

if [ condition1 ]

语法:

if [条件 1]

then

if [条件 2 ]

then

......

fi

fi

2.8.3.案例案例案例案例

案例一

语法的使用

#!/bin/bash

#说明 if 的使用

var=0

if ((var)) #这里是必须换行的, 除非利用;分隔

then echo Hello #这里可以不换行的

fi

if ((var==20)) #这里是必须换行的

then #这里可以不换行的

echo "20== ${var}"

else

echo "20<> ${var}"

fi

if ((var <=60));then

echo 菜鸟

elif ((var<=70));then

echo 及格

elif ((var<=80));then

echo 中等

elif ((var<=90));then

echo 良好

elif ((var<100));then

echo 优秀

else

echo 超人

Page 35: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

fi

案例二

条件测试

#!/bin/bash

#说明条件测试的使用

var=0

if [ ]

then

echo "NOT NULL"

else

echo "NULL"

fi

if [ -z $1 ]

then

echo "没有命令行参数"

else

echo "有命令行参数"

fi

#比较下面异同

if [[ $var < 20 ]]

then

echo "var<20"

else

echo "var>=20"

fi

if [ $var \< 20 ]

then

echo "var<20"

else

echo "var>=20"

fi

#if [ $var \< 20 ]

#then

# echo "var<20"

#else

# echo "var>=20"

Page 36: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

#fi

file1="sh1.sh"

if [ -e $file ]

then

echo "${file}存在"

else

echo "${file}不存在"

fi

案例三

测试环境

#!/bin/bash

#说明 BASH 选项测试的使用

#该选项依赖环境.可能看不见效果

#为保证在同一个环境,请使用 source 运行

if [ -o noclobber ]

then

echo "文件重定向保护"

else

echo "可以重定向到已知文件"

fi

if [ -o noclobber ]; then echo "hello" ;fi

案例四

其他形式的测试

#!/bin/bash

# 测试得其他使用

if ! grep "#!/bin/bash" $1 >/dev/null

then

echo "$1 是 bash 脚本"

else

echo "$1 可能不是 bash 脚本"

fi

if ls .>/dev/null

then

echo 目录不空

else

echo 目录空

fi

案例五

Page 37: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

test 测试

#!/bin/bash

# 字符比较

if test "$(whoami)" != 'root'

then

echo "不是 root 用户 1."

fi

if [ "$(whoami)" != 'root' ]

then

echo "不是 root 用户 2."

fi

案例六

Case 的使用

#!/bin/bash

# case 的使用

declare a

read a

case $a in

1[0-9])

echo 10-20 之间的数

;;

2[0-9])

echo 20-30 之间的数

;;

???)

echo 三位数

;;

*)

echo 其他

;;

esac

2.8.4.课堂练习课堂练习课堂练习课堂练习

练习一

判定一个目录是否存在,存在就在目录下建立一个文件文件,否则就建立同名目录

练习二

写 shell 实现一个菜单选择。

Page 38: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.9.循环循环循环循环

2.9.1.目的目的目的目的

技术:

1. 掌握 for 循环的使用。

2. 掌握 while 循环的使用。

3. 掌握 until 循环的使用

4. 掌握循环的中断与跳转。

技能:

1. 能根据需要选择使用循环控制 SHELL 执行流程。

2. 能熟练使用中断语句控制 SHELL 执行流程。

2.9.2.知识点说明知识点说明知识点说明知识点说明

2.9.2.1. for 循环语法循环语法循环语法循环语法

语法:

for NAME [in LIST ]

do

......

done

说明:

for 循环是 3个 shell 循环结构中的第一个。这个循环允许指定一个值的列表。列表中

的命令为每个在列表中的值执行。

NAME 可以使任何变量的名字,虽然 i 的使用非常普遍。 LIST 可以是任何字的列表,

字符串和数字,或者命令生成的结果。执行的循环语句可以是任何操作系统命令,脚本,程

序或者 shell 语句。第一次执行循环的时候,NAME 设置为 LIST 中的第一个项目。第二次,

它的值设置成列表中的第二个项目,以此类推。当 NAME 得到了在 LIST 中所有的值之后

循环中止。

2.9.2.2.while 循环语法循环语法循环语法循环语法

语法:

while 条件测试

do

循环语句

......

done

Page 39: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

说明:

测试条件可以是任何可以返回成功或者失败状态的命令(组)。

循环语句可以是任何程序,脚本或者 shell 结构。只要 测试条件 一失败,循环就退出。

在一个脚本当中,跟随 done 语句的命令就执行。

返回状态是最后的 测试条件 命令的退出状态,如果什么都没有执行就是零。

2.9.2.3.until 循环语法循环语法循环语法循环语法

语法:

until 测试条件

do

循环语句

......

done

说明:

until 循环和 while 循环非常相似, 除了循环执行直到 测试条件 执行成功。只要这

个命令测试失败,循环就继续。

返回状态是最后一个循环中 循环语句执行的命令的退出状态,或者没有执行的话就是

零。 测试条件 可以是任何能退出带成功或者失败状态的命令,而 循环语句 可以是任何

UNIX 命令,脚本或者 shell 结构。

2.9.2.4.continue 与与与与 break 使用使用使用使用

语法:

continue 与 break 是内置命令。使用在循环中。

说明:

break 语句用来在正常结束之前退出当前循环。一般在当你事先不知道循环得执行多少

次的时候使用。

continue 语句继续 for, while, until or select 内的循环。

当在 for 循环使用的时候,控制变量取得列表中的下一个元素的值。当在一个 while

或者 until 结构中使用时,另一方面,执行随着 测试条件 在循环的顶部继续。

2.9.2.5.select 语法语法语法语法(选选选选)

语法:

select WORD [in LIST]

do

处理语句

done

说明:

Page 40: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

LIST 扩展开来,生成一个选项的列表。扩展后的内容被打印到标准错误;每个选项都

以一个数字开始。如果 in LIST 不存在,位置参数就打印出来. LIST 只打印一次。

在打印所有选项的时候,PS3 提示被打印出来然后读取来自标准输入的一行。如果这行

由那个选项的相关数字组成,那么 WORD 的值就设置成那个选项的名字。如果这行是空的,

选项和 PS3 提示就再次显示出来。如果一个 EOF (End Of File) 字符被读取,循环就退出。

读取的行存储在 REPLY 变量。

处理语句 在每个选择之后执行直到读取了代表 break 的数字。退出循环。

2.9.2.6.shift 语法语法语法语法(选选选选)

语法:

shift [数字]

说明:

shift 命令是包含在 Bash 内的一个 Bourne shell 内建命令。这个命令需要一个参数,

一个数字。

当 shift 不带命令参数,默认是 1。

命令 shift 的作用是设置循环列表中的选项初始位置,使用例子说明如下:

shift 5 命令把原来的第一选项变成第五个选项,后面依次类推,前面的四个选项就

被舍弃。

2.9.3.案例案例案例案例

案例一

说明 for 的使用:对列表,数组,字符串,数字,和指令执行结果进行循环

#!/bin/bash

# for 的使用

#列表循环

for v1 in 1 2 3 4

do

echo $v1

done

#数组循环

v2=(1 2 3 4 5)

for v1 in ${v2[*]}

do

echo $v1

done

#字符串循环

v3="hello shell programming"

Page 41: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

for v1 in $v3

do

echo $v1

done

#for 综合

a=1

for i in `ls -a`

do

echo -en "${i}\t"

let a%=5

if [ ${a} == 0 ]

then

echo

fi

let a++

done

案例二

说明 while 的使用。

#!/bin/bash

# while 的使用

i="0"

while [ $i -lt 4 ]

do

echo "循环输出$i"

i=$[$i+1]

done

案例三

#!/bin/bash

# unti 的使用

i="0"

until [ $i -gt 4 ]

do

echo "循环输出$i"

i=$[$i+1]

done

案例四

定向操作

#!/bin/bash

# 对命令结果执行循环

find $PWD -type f | while read file

Page 42: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

do

#echo "文件$file"

zip bak.zip $file

done

案例五(综合案例)

定时执行文件备份与其他日常工作。

#!/bin/bash

#整点就备份文件

BACKDIR=./bak

if ! [ -d $BACKDIR ]

then

mkdir $BACKDIR

fi

while true

do

HOUR=`date +%H`

if [ $HOUR -eq "00" ]

then

echo "备份中`date`"

cp *.sh $BACKDIR

echo "备份完毕"

break

fi

done

案例六(综合案例)

输入若干数,计算平均数。

#!/bin/bash

# 计算平均成绩.

SCORE="0"

AVERAGE="0"

SUM="0"

NUM="0"

while true

do

echo -n "输入成绩[0-100%] (退出'q'): "; read SCORE;

if (("$SCORE" < "0")) || (("$SCORE" > "100"))

then

echo "不对,重输: "

elif [ "$SCORE" == "q" ]; then

Page 43: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

echo "平均成绩是: $AVERAGE."

break

else

let SUM+=SCORE

let NUM++

let AVERAGE=SUM/NUM

fi

done

2.9.4.课堂练习课堂练习课堂练习课堂练习

练习一

打印乘法表。(打印完整的乘法表,然后加 break 与 continue 打印三角形的乘法表)

练习二

判定输入的数是否素数。

练习三

写一个脚本,每一个小时备份系统登录日志文件,并使用清空原日志文件。

练习四

写一个脚本,使用循环定期检查工作目录下的文件。如果文件是 c代码文件是新建文件

或者修改过的文件就备份。如果是 o文件就删除。

练习五

输入一个数,打印所有比他小的素数。

练习六

阅读 select 案例代码,并执行观察效果。

#!/bin/bash

#select 的使用

#请使用 * 替换

PS3=">"

select FILENAME in Red blue Green

do

echo "文件循环 $FILENAME ($REPLY)."

if [ ${REPLY} == 0 ]

then

echo "退出"

break

fi

done

练习七

阅读 shift 案例代码,并执行观察效果。

#!/bin/bash

#shift 的使用

Page 44: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

#shift 就是删除前面得位置参数

while [ $# -gt 0 ]

do

echo "颜色:$#.$1"

shift 2

if [ $? == 1 ]

then

break

fi

done

2.10.函数函数函数函数

2.10.1.目的目的目的目的

技术:

1. 掌握各种函数的定义。

2. 掌握函数的调用。

3. 掌握函数重定向。

4. 掌握函数中变量的作用范围。

5. 了解函数的递归的缺点。

技能:

1. 能根据需要把独立功能或者重复语句组织成函数。就是抽象并实现函数。

2. 能调用函数。

2.10.2.知识点说明知识点说明知识点说明知识点说明

2.10.2.1.函数语法函数语法函数语法函数语法

什么是函数?

shell 函数是一种语句组织方式,使用单个名字来命名这些语句组。一个函数就是一个

子程序。在 shell 或者是脚本当中,这个过程的名字必须是唯一的。函数的语句的执行与原

来一样执行。当以一个简单的命令名来调用函数的时候,和该函数相关的命令就被执行。函

数必须声明,然后在 shell 里执行,对函数不会创建新的进程。

特殊的内建命令在命令查找中先于shell函数。特殊的内建命令:break, :, ., continue,

eval, exec, exit, export, readonly, return, set, shift, trap 和 unset.

语法一:

function 函数名

{

Page 45: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

语句

......

}

语法二:

函数名 ()

{

语句

......

}

说明:

1.内建的 function 命令是可选的;然而,如果不使用,必须在函数名后加上小括

号。

2.函数体必须以分号或者新行结尾。

2.10.2.2.函数的参数函数的参数函数的参数函数的参数与返回值与返回值与返回值与返回值

说明:

函数就是小型脚本:他们可以接受参数,他们可以使用只有在函数中有效的变量(使

用本地内建 local )并且他们可以向调用者返回参数。

一个函数也有可以有参数,然而传递给函数的参数和传递给命令或者脚本的参数是

不一样的。

当函数开始执行,在执行期间函数的参数变成位置参数。扩展为位置参数的数量的

特别参数 # 更新来反映这个变化。位置参数 0 未改变。

Bash 变量 FUNCNAME 在函数执行时被设置为函数的名字。

如果内建的 return 在函数中执行时,完成调用,并且执行下一条命令。当函数调

用完成后,位置参数的值和特别参数 # 被重置到函数执行前的值。如果一个数字参数

被赋予 return ,那个状态就返回了。

使用:

使用函数的参数与使用 shell 中的参数没有什么不同。使用$*、$*、$#。

返回 return 状态码,也可以缺省使用最后一条语句的执行状态做为返回。最大返

回数字是 255。

可以利用状态码返回整数类型的数据。

如果想返回其他类型,比如数组与字符串,则需要定义全局变量来操作。

2.10.2.3.函数嵌套与特殊用法函数嵌套与特殊用法函数嵌套与特殊用法函数嵌套与特殊用法

例子例子例子例子 1::::

fun1 ()

{

Page 46: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

fun2 () # 嵌套

{

echo "函数\"fun2\", 嵌套在 \"fun1\"中."

}

}

说明说明说明说明 1::::

调用 fun1 不会主动调用 fun2,但只有调用 fun1 后才能调用 fun2。就是先使用

declare –f fun2 也不行。

结论结论结论结论 1111::::

尽量不要使用嵌套。

例子例子例子例子 2222::::

ls -l | fun() { echo "函数"; }

==================================

if [ "$USER" = yangqiang ]

then

hello () # 在 if/then 结构中定义了函数.

{

echo "Hello, ${USER}."

}

fi

hello # 只能由 yangqiang 运行, 其他用户使用的话, 会引起错误.

结论结论结论结论 2222::::

函数可以用在任何语句调用的位置上,函数还是做为一个语句执行。

2.10.2.4.函数与重定向函数与重定向函数与重定向函数与重定向

语法:

输入重定向

Function ()

{

...

} < file

Function ()

{

{

...

} < file

}

输出重定向

Function ()

Page 47: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

{

...

} > file

Function ()

{

{

...

} > file

}

思考:请考虑对管道符号是否同样有效?

2.10.2.5.变量与函数变量与函数变量与函数变量与函数

首先看一个例子:

#!/bin/bash

# 函数内部的局部变量与全局变量.

func ()

{

var=999 # 默认为全局变量.

}

func

# 现在, 来看看变量"var"在函数外部是否可见.

echo "$ var" # $var 是全局可见的.

exit 0

# 与 C 语言相比, 在函数内声明的 Bash 变量

#+ 除非它被明确声明为 local 时, 它才是局部的.

定义局部变量:

语法:local 变量名

说明:

如果变量用 local 来声明, 那么它就只能够在该变量被声明的代码块中可见. 这个代

码块就是局部"范围". 在一个函数中, 一个局部变量只有在函数代码块中才有意义.

结论:

局部变量使递归变为可能。

局部变量允许递归,但是这种方法会产生大量的计算, 因此在 shell 脚本中, 非常明确

的不推荐这种做法.过多层次的递归可能会产生段错误, 继而导致脚本崩溃.

2.10.3.案例案例案例案例

案例一

返回两个数中最大数。

Page 48: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

#!/bin/bash

#函数

myfun()

{

return $(( $1 + $2 ))

}

myfun 12 34

echo $?

案例二

素数判定函数的实现。

#!/bin/bash

#函数

primer()

{

if [ $(( $1 % 2)) == 0 ]

then

return 1

else

b=2

while [ $b -le $(($1-1)) ]

do

if [ $(($1 % b)) -eq 0 ]

then

echo $b

return 1

fi

let b++;

done

fi

return 0

}

read a

primer a

if [ $? -eq 0 ]

then

echo "素数"

else

echo "合数"

fi

案例三

Page 49: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

传递引用参数给函数

#!/bin/bash

# 将一个间接引用传递给函数.

echo_var ()

{

echo "$1"

}

message=Hello

Hello=Goodbye

echo_var "$message" # Hello

#注意传递的语法格式

echo_var "${!message}" # Goodbye

# 改变"hello"变量的值运行的效果

Hello="Hello, 改变了!"

echo_var "$message"

echo_var "${!message}"

案例四

函数重定向

#!/bin/bash

# 重定向与函数.

redir ()

{

read a

echo "hello $a"

}>file.txt

redir

redir2()

{

read b

echo $b

}<file.txt

redir2

案例五

使用递归计算 1到 n的和。

#!/bin/bash

# 局部变量与递归.

sum()

Page 50: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

{

local la=$1

if [ ${la} -eq 1 ]

then

return 1

else

sum $((la-1))

local lb=$?

return $((la+lb))

fi

}

sum 10

echo $?

#返回值不能超过 255

2.10.4.课堂课堂课堂课堂练习练习练习练习

练习一

写一个函数把阿拉伯数字转换为罗马数字。首先实现 1-9 的转换,然后实现任何转换。

练习二

思考:which 函数名,会出现什么效果了?

2.11.子子子子 shell

2.11.1.目的目的目的目的

技术

1. 掌握子 SHELL 的调用方式及其区别。

2. 掌握子 SHELL 限制的语法。

3. 掌握子 SHELL 的重定向与管道符号的使用

技能

1. 能熟练使用子 SHELL 完成一些子任务。

Page 51: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.11.2.知识点说明知识点说明知识点说明知识点说明

2.11.2.1.子子子子 SHELL 调用方式调用方式调用方式调用方式

1.fork

语法:/wd/shell.sh

fork 是最普通的, 就是直接在脚本里面用/wd/shell.sh 来调用 shell.sh 这个脚

本.运行的时候开一个子 shell 执行调用的脚本,子 shell 执行的时候, 父 shell 还在。

子 shell 执行完毕后返回父 shell。子 shell 从父 shell 继承环境变量.但是子 shell 中

的环境变量不会带回父 shell

2.exec

语法: exec /wd/shell.sh

exec 与 fork 不同,不需要新开一个 sub-shell 来执行被调用的脚本. 被调用

的脚本与父脚本在同一个 shell 内执行。但是使用 exec 调用一个新脚本以后, 父

脚本中 exec 行之后的内容就不会再执行了。这是 exec 和 source 的区别。

3.source

语法:source /wd/shell.sh

与 fork 的区别是不新开一个子 shell 来执行被调用的脚本,而是在同一个 shell

中执行。所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使

用。

4.()

语法:( 语句;语句;语句;…… )

圆括号中命令列表的命令将会运行在一个子 shell 中。

2.11.2.2.子子子子 SHELL 调用说明调用说明调用说明调用说明

运行一个 shell 脚本的时候,会启动命令解释器的另一个实例。 就好像你的命令是

在命令行提示下被解释的一样,类似于批处理文件中的一系列命令。每个 shell 脚本都

有效地运行在父 shell 的一个子进程中。这个父 shell 指的是在一个控制终端或在一个

xterm 窗口中给出命令提示符的那个进程。

shell 脚本也能启动它自已的子进程。这些子 shell 能够使脚本并行的, 有效的,

同时运行多个子任务。

一般来说,脚本中的外部命令能够生成(fork)一个子进程,然而 Bash 的内建命令

却不会这么做。也正是由于这个原因, 内建命令比等价的外部命令要执行的快。

结论:

Page 52: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

1. 子 shell 中的变量对于子 shell 之外的代码块来说, 是不可见的。当然, 父进

程也不能访问这些变量, 父进程指的是产生这个子 shell 的 shell。事实

上, 这些变量都是局部变量。

2. 子 shell 中的目录更改不会影响到父 shell。

3. {语句;语句;……}不会启动子 SHELL。

2.11.2.3.受限受限受限受限 SHELL 脚本脚本脚本脚本

为了限制脚本用户的权限, 并且能够让运行脚本所导致的危害降低到最小,可以对

脚本进行限制。具体知识点请参考后面关于 bash 参数选项的说明。就是对 SHELL 指定

-r 选项。有两种方式指定

语法一:

#!/bin/bash -r

语法二:

set –r

在受限 shell 中禁用的命令

在受限模式下运行一个脚本或脚本片断, 将会禁用某些命令, 这些命令在正

常模式下都可以运行。

·使用 cd命令更改工作目录。

·更改环境变量$PATH, $SHELL, $BASH_ENV, 或$ENV 的值。

·读取或修改环境变量$SHELLOPTS 的值。

·输出重定向。

·调用的命令路径中包括有一个或多个斜杠(/)。

·调用 exec, 把当前的受限 shell 替换成另外一个进程。

·能够在无意中破坏脚本的命令。

·在脚本中企图脱离受限模式的操作。

2.11.3.案例案例案例案例

案例一

演示 source 与子 shell 下变量的效果。

步骤一:编写脚本

#!/bin/bash

# exec fork source.

c="hello 看见我就是 source 执行"

#echo "下面 exec 执行,shell 终止"

#exec sh10_6.sh

#echo "不能看见输出哦,进程终止了"

步骤二:

直接执行脚本 sh11.sh

echo $c 无法看见 c变量得输出。

步骤三:

执行脚本 source sh11.sh。

Page 53: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

echo $c 能看见 c 变量输出。

案例二

演示子 shell 的一个应用, 是可以用来检测一个变量是否被定义。

#!/bin/bash

#检测 a 变量是否存在

#注意: 后的空格

a=2

if (set -u; : $PATH) 2> /dev/null

then

echo "变量已经设置."

fi

案例三

演示子 shell 还可以用来检测一个加锁的文件。

if (set -C; : > lock_file) 2> /dev/null

案例四

演示 SHELL 脚本重定向与管道

ls -al | (command)

2.11.4.课堂练习课堂练习课堂练习课堂练习

2.11.5.思考与提高思考与提高思考与提高思考与提高

思考子 SHELL 对管道符号与重定向符号的使用。

2.12.内建命令内建命令内建命令内建命令

2.12.1.目的目的目的目的

技术:

1. 了解所有内建命令。

2. 掌握常用的内建命令。

技能:

1. 能使用内建命令进行。

2. 能使用内建命令进行。

3. 能使用内建命令进行。

4. 能使用内建命令进行。

5. 能使用内建命令进行。

Page 54: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.12.2.知识点说明知识点说明知识点说明知识点说明

内建命令指的就是包含在 Bash 工具包中的命令,这主要是考虑到执行效率的问题: 内

建命令将比外部命令执行的更快:

一部分原因是因为外部命令通常都需要 fork 出一个单独的进程来执行 。

另一部分原因是特定的内建命令需要直接访问 shell 的内核部分。

当一个命令或者是 shell 本身需要初始化(或者创建)一个新的子进程来执行一个任务的

时候,这种行为被称为 fork。这个新产生的进程被叫做子进程,并且这个进程是从父进程中

fork 出来的。当子进程执行它的任务时,父进程也在运行。

可以使用 enable 查看内建命令

2.12.2.1.echo 命令

语法:echo [options]... [string]...

作用:标准输出

选项:

-n' 不输出换行

-E' 关闭转义符号

-e' 下列转义符号有效

\a alert (bell)

\b backspace

\c suppress trailing newline

\e escape

\f form feed

\n new line

\r carriage return

\t horizontal tab

\v vertical tab

\\ backslash

\NNN 8 进制 ASCII 字符

\xnnn 16 进制 ASCII 字符

2.12.2.2. read 命令

语法:read [-ers] [-a aname] [-p prompt] [-t timeout] [-n nchars] [-d delim]

[name...]

作用:从标准输入读取一行。

选项:

-a aname 输入数组。

-d delim 输入结束符号。

-e 如果输入来自终端,则使用 readline 获取输入。

-n nchars 限制输入字符个数。不检测换行符号。

-p prompt 设置输入前的提示。

-r \不做为转义字符,\在输入中做为续行符号。

Page 55: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

-s 安静模式,输入字符不显示出来。

-t timeout 输入的时间限制,对非终端与管道输入没有作用。单位秒。

Read 与重定向符号与管道符号联合使用有强大得功能。见案例。

2.12.2.3.cd 命令

语法:cd [Options] [Directory]

作用:改变当前工作目录

选项:

-P Do not follow symbolic links

-L Follow symbolic links (default)

注意:cd – 返回历史目录

成功返回 0,负责非 0。

2.12.2.4.pwd 命令

语法:pwd [-LP]

作用:打印出当前的工作目录。这将给出用户(或脚本)的当前工作目录 。使用这

个命令的结果和从内建变量$PWD 中所读取的值是相同的。

选项:同 cd 命令。

2.12.2.5. pushd 命令、popd 命令、dirs 命令

语法:

pushd [dir | +N | -N] [-n]

popd [+N | -N] [-n]

dirs [+N | -N] [-clpv]

作用:

这几个命令可以使得工作目录书签化, 就是可以按顺序向前或向后移动工作

目录. 压栈的动作可以保存工作目录列表. 选项可以允许对目录栈做不同的操作.

pushd dir-name 把路径 dir-name 压入目录栈, 同时修改当前目录到

dir-name.

popd 将目录栈最上边的目录弹出, 同时将当前目录修改为刚弹出来的那个目

录.

dirs 列出所有目录栈的内容 (与$DIRSTACK 变量相比较). 一个成功的 pushd

或者 popd 将会自动调用 dirs 命令.

对于那些并没有对当前目录做硬编码, 并且需要对当前工作目录做灵活修改

的脚本来说, 使用这些命令是再好不过了. 注意内建$DIRSTACK 数组变量, 这个

变量可以在脚本中进行访问, 并且它们保存了目录栈的内容.

选项:

+N 从左滚动栈把第 N 个元素置顶。

-N 从右滚动栈把第 N 个元素置顶。

-n 当加目录到栈时禁止目录改变。只有栈被改变。

dir 目录

-c 清空栈

-l 使用完整名称,禁止使用~这样得符号替代主目录。

Page 56: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

-p 打印目录的时候一行一个目录。

-v 打印目录的时候一行一个目录。同时打印在栈中索引号。

2.12.2.6.let 命令

语法:let expression [expression]

作用:执行 shell 中的算术运算,在许多情况下, 它被看作是复杂的 expr 命令的

一个简化版本。

说明:如果最后表达式返回 0,则 let 返回 1,否则返回 0。

2.12.2.7.eval 命令

语法:eval [arguments]

作用:

执行多个命令。将表达式中的参数, 或者表达式列表, 组合起来, 然后评价它

们。 任何被包含在表达示中的变量都将被扩展. 结果将会被转化到命令中. 如果

你想从命令行中或者是从脚本中产生代码, 那么这个命令就非常有用了.

说明:

eval 命令是有风险的, 如果你有更合适的方法来实现功能的话, 尽量避免使

用它。eval $COMMANDS 将会执行命令 COMMANDS 的内容, 如果命令中包含有 rm -rf

*这样的东西, 可能就不是你想要的了。当你运行一个包含有 eval 命令的陌生人所

编写的代码片段的时候, 这是一件很危险的事情。

2.12.2.8.set 命令

语法:set [--abBCefhHkmnpPtuvx] [-o option] [argument ...]

作用:

set 命令用来修改内部脚本变量的值。

它的一个作用就是触发选项标志位来帮助决定脚本的行为。

另一个作用是以一个命令的结果(set `command`)来重新设置脚本的位置参

数,脚本将会从命令的输出中重新分析出位置参数。

选项:

-a allexport

标记所有变量为 expport 。

-b notify

在打印下一个基本提示之前立即报告被终止得后台任务得状态。

-B braceexpand

SHELL 执行{}扩展,缺省是 on。

-C noclobber

阻止输出重定向符号>, >&,<>覆盖存在得文件。

-e errexit

命令返回非 0,则马上退出,until,while,if,&&,|| 中得命令例外。

-f noglob

禁止带扩展名的路径 。

-h hashall

Page 57: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

定义函数时,定位和存储函数命令,当函数被执行时,通常查询函数命令。

-H histexpand

!做为历史替换有效,在交互 shell 中有效。

-k keyword

所有的关键词参数,而不只是那些命令名前的关键词参数,被放在环境命令

中。

-m monitor

监视器模式,启动任务控制.此选项默认支持系统 shell 交互。后台进程以单

独的进程组运行,在每次完成任务时显示包含退出的状态行。

-n noexec

读取命令但不执行命令.通常监查 shell 脚本的句法错误.交互 shell 被忽

略。

-o option-name

emacs : 使用 emacs 风格命令行编辑接口.除非 shell 以

-noline-editing 选项启动,否则当 shell 交互时,通过默认启动该选项 。

history : 开启历史命令有效。

ignoreeof : 交互 shell 知道 EOF 才退出。

posix : 改变 BASH 属性以匹配标准,默认操作不同于 POSIX1003.2 标

准。

vi : 使用 vi 风格命令行编辑接口。

-p privileged

打开特权模式。(在此模式,$ENV文件被处理,不能从环境中继承shell函数.

如果是有效用户ID而不是实用户组则自动启动.关闭此选项将使得有效用户和组IDs设置实

用户和组 IDs)

-P physical

如果设置此参数,当执行改变目录命令 cd 时,不遵循符号链接,而是使用实

际的目录。

-t onecmd

在读取命令并执行之后退出。

-u nounset

当执行参数括展时,把非设置变量作为错误处理。(如果扩展企图出现在非设

置变量中,shell 显示错误信息.如果不是交互式,则带非凌值退出)

-v verbose

输入行被读取时,显示 shell 输入行。

-x xtrace

在每个简单命令被扩展之后,显示 PS4 扩展值,之后是要执行的命令。

--

如果在选项后没有参数,不设置位置参数.否则,即使一些参数以-选项开始,

也要把位置参数设置为 argument:

-

结束选项的信号,将引发其余的参数被赋值到位置参数中(-x 和-v

选项被关闭。如果没有 argument,位置参数将保留未改变的参数)

2.12.2.9.unset 命令

语法:unset [-fv] [name]

Page 58: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

作用:

选项:

-f 函数名

-v 变量名

2.12.2.10.export 命令

语法:export [-fn] [-p] [name[=value]]

作用:

选项:

-f 导出函数,否则导出变量。

-n 取消导出。

-p 以可以重用输入得方式显示输出。

2.12.2.11.declare 命令、typeset 命令

语法:

declare [-afFrxi] [-p] [name[=value]]

作用:

选项:

2.12.2.12.readonly 命令

语法:readonly [-apf] [name]

作用:

选项:

-a 标记 name 是数组名。

-f 标记 name 是函数名。

-p 打印所有只读名。

2.12.2.13.getopts 命令

语法:getopts optstring name [args]

作用:

可以说这个命令是分析传递到脚本中命令行参数的最强力的工具. 这个命令

与外部命令getopt, 还有C语言中的库函数getopt的作用是相同的. 它允许传递

和连接多个选项到脚本中, 并且能够分配多个参数到脚本中(比如: scriptname

-abc -e /usr/local).

getopts 结构使用两个隐含变量. $OPTIND 是参数指针(选项索引) 和

$OPTARG(选项参数)(可选的)可以在选项后边附加一个参数. 在声明标签中, 选项

名后边的冒号用来提示这个选项名已经分配了一个参数.

getopts结构通常都组成一组放在一个while循环中, 循环过程中每次处理一

个选项和参数, 然后增加隐含变量$OPTIND 的值, 再进行下一次的处理.

说明:

Page 59: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

1. 通过命令行传递到脚本中的参数前边必须加上一个减号(-). -是一个前

缀, 这样 getopts 命令把这个参数看作为一个选项. 事实上, getopts

不会处理不带-前缀的参数, 如果第一个参数就没有-, 那么将会结束

选项的处理.

2. getopts的 while循环模板与标准的while循环模板有些不同, 没有标准

循环中的中括号[]判断条件.

3. getopts 结构将会取代外部命令 getopt.

while getopts mdyDHMSTjJwahr OPTION

do

case $OPTION

in

m) date '+%m ';; # Month of Year

d) date '+%d ';; # Day of Month

y) date '+%y ';; # Year

D) date '+%D ';; # MM/DD/YY

H) date '+%H ';; # Hour

M) date '+%M ';; # Minute

S) date '+%S ';; # Second

T) date '+%T ';; # HH:MM:SS

j) date '+%j ';; # day of year

J) date '+%y%j ';;# 5 digit Julian date

w) date '+%w ';; # Day of the Week

a) date '+%a ';; # Day abbreviation

h) date '+%h ';; # Month abbreviation

r) date '+%r ';; # AM-PM time

\?) echo "Invalid option $OPTION";;

esac

done

2.12.2.14.source 命令、.命令

语法: . filename [arguments]

source filename [arguments]

作用:

当在命令行中调用的时候, 这个命令将会执行一个脚本. 当在脚本中调用的

时候, source file-name 将会加载 file-name 文件. sourc 一个文件(或点命令)

将会在脚本中引入代码, 并将这些代码附加到脚本中(与C语言中的#include指令

效果相同). 最终的结果就像是在使用"source"的行上插入了相应文件的内容. 在

多个脚本需要引用相同的数据, 或者需要使用函数库的情况下, 这个命令非常有

用.

2.12.2.15.exit 命令

语法:exit

作用:

Page 60: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

无条件的停止一个脚本的运行. exit 命令可以随意的取得一个整数参数, 然

后把这个参数作为这个脚本的退出状态码. 在退出一个简单脚本的时候, 使用

exit 0 的话, 是种好习惯, 因为这表明成功运行.

注意:

如果不带参数调用 exit 命令退出的话, 那么退出状态码将会将会是脚本中最

后一个命令的退出状态码. 等价于 exit $?.

2.12.2.16.exec 命令

语法:exec [-cl] [-a name] [command [arguments]]

作用:

这个shell内建命令将使用一个特定的命令来取代当前进程. 一般的当shell

遇到一个命令, 它会 forks off 一个子进程来真正的运行命令. 使用 exec 内建命

令, shell就不会fork了, 并且命令的执行将会替换掉当前shell. 因此, 在脚本

中使用时, 一旦 exec 所执行的命令执行完毕, 那么它就会强制退出脚本.

选项:

-c shell 脚本以空环境变量执行

-l 传递.做为命令的第 0 个参数(登录程序行为)

-a 传递 name 做为第 0个参数

2.12.2.17.shopt 命令

语法:shopt [-pqsu] [-o] [optname ...]

作用:

这个命令允许 shell 在空闲时修改 shell 选项 . 它经常出现在启动文件中,

但在一般脚本中也常出现. 需要在版本 2之后的 Bash 中才支持.

选项:

2.12.2.18.caller 命令

语法:caller

作用:

将caller命令放到函数中, 将会在stdout上打印出函数的调用者信息. 这个

命令在调试的时候特别有用

选项:

2.12.2.19.true 命令、false 命令

语法: true

false

作用:

这是一个返回(0|1)成功退出状态码的命令, 但是除此之外不做任何事.

选项:

Page 61: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.12.2.20.type 命令

语法:type [-atp] [name ...]

作用:

与外部命令 which 很相像, type cmd 将会给出"cmd"的完整路径. 与 which 命

令不同的是, type 命令是 Bash 内建命令. -a 是 type 命令的一个非常有用的选项,

它用来鉴别参数是关键字还是内建命令, 也可以用来定位同名的系统命令.

选项:

-a 返回类型

-t 打印内建命令、SHELL 关键字、SHELL 别名、SHELL 函数、磁盘文件。

-p 如果后面接的 name 为指令时,会显示完整档名(外部指令)或显示为内建

指令

说明:显示磁盘外部命令是 PATH 环境变量路径下的所有执行文件。

2.12.2.21.hash 命令

语法:hash [-r] [-p filename] [name]

作用:

在shell的hash表中,记录指定命令的路径名, 所以在shell或脚本中调用这

个命令的话, 就不需要再在$PATH 中重新搜索这个命令了. 如果不带参数的调用

hash 命令, 它将列出所有已经被 hash 的命令. -r 选项会重新设置 hash 表.

选项:

-r 重置所有记住的历史位置。等同于删除。

-p 使用 filename 做为 name 的位置。

2.12.2.22.help 命令

语法:help 内建命令

作用:获得 shell 内建命令的一个小的使用总结

说明:enable 可以查看所有内建命令。

2.12.3.案例案例案例案例

案例一

案例二

案例三

案例四

案例五

案例六

暂时无

Page 62: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.12.4.课堂练习课堂练习课堂练习课堂练习

暂时无

2.12.命令与程序命令与程序命令与程序命令与程序

标准的 UNIX 命令使得 shell 脚本更加灵活.通过简单的编程结构把 shell 指令和系统

命令结合起来,这才是脚本的魅力所在。相当于 C 的函数库。

2.12.1.目的目的目的目的

技术:

1. 掌握基本命令。

2. 掌握高级命令。

3. 掌握时间/日期 命令。

4. 掌握文本处理命令。

5. 掌握文件与归档命令。

6. 掌握通讯命令。

7. 掌握终端控制命令。

8. 掌握数学计算命令。

9. 掌握其他一些常见命令。

技能:

1. 能熟练使用常用命令与程序。

2. 能使用在线文档使用大部分命令与程序。

2.12.2.知识点说明知识点说明知识点说明知识点说明

2.12.2.1.基本命令基本命令基本命令基本命令

ls

cat tac

rev

cp

mv

rm

rmdir

chmod

chattr

ln

man info

Page 63: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.12.2.2.高级命令高级命令高级命令高级命令

find

xargs

expr

2.12.2.3.时间时间时间时间/日期命令日期命令日期命令日期命令

date

zdump

time

touch

at

batch

cal

sleep

usleep

hwclock clock

2.12.2.4.文本处理命令文本处理命令文本处理命令文本处理命令

sort

tsort

uniq

expand

unexpand

cut

paste

join

head

tail

grep

look

sed

awk

wc

tr

fold

fmt

col

column

colrm

Page 64: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

nl

pr

gettext

msgfmt

iconv

recode

enscript

2.12.2.5.文件与归档命令文件与归档命令文件与归档命令文件与归档命令

tar

shar

ar

rpm

cpio

rpm2cpio

gzip

bzip2

compress

uncompress

zip

unzip

file

which

whereis

whatis

vdir

locate slocate

readlink

strings

diff patch

diff3

cmp

comm

basename

dirname

split csplit

uuencode

uudecode

mktemp

make

Page 65: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

install

dos2unix

more

less

2.12.2.6.通讯命令通讯命令通讯命令通讯命令

host

ipcalc

nslookup

dig

traceroute

ping

whois

finger

chfn

vrfy

ftp

telnet

wget

rlogin

rsh

rcp

rsync

ssh

write

netconfig

mail

mailto

vacation

2.12.2.7.终端控制命令终端控制命令终端控制命令终端控制命令

tput

infocmp

reset

clear

script

Page 66: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.12.2.8.数学计算命令数学计算命令数学计算命令数学计算命令

factor

bc

dc

awk

2.12.2.9.其他命令其他命令其他命令其他命令

jot, seq

getopt

run-parts

yes

banner

printenv

lp

tee

mkfifo

pathchk

objdump

mcookie

units

dialog

2.12.3.案例案例案例案例

暂时无

2.12.4.课堂练习课堂练习课堂练习课堂练习

Page 67: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

2.13.命令命令命令命令与进程与进程与进程与进程替换替换替换替换

2.13.1.目的目的目的目的

技术

1. 掌握命令替换的使用

2. 掌握进程替换的使用

技能

1. 能使用命令替换实现一些 SHELL 编程技巧.

2. 能使用进程替换实现一些 SHELL 编程技巧.

2.13.2.知识点说明知识点说明知识点说明知识点说明

2.13.2.1.命令替换命令替换命令替换命令替换

命令替换把一个命令的结果赋值给一个变量,比如 dir_contents=`ls -al`或

xref=$( grep word datafile)。

语法:

`命令`

$()

注意:

1. 命令替换将会调用一个 subshell

2. 命令替换可能会引起单词分割(word split)

3. 即使没有引起单词分割(word split), 命令替换也会去掉多余的新行

4. 命令替换甚至允许将整个文件的内容放到变量中, 可以使用重定向或者

cat 命令

5. 变量替换允许将一个 loop 的输出设置到一个变量中

6. 命令替换使得扩展有效Bash工具集变为可能 这样, 写一段小程序或者一

段脚本就可以达到目的. 因为程序或脚本的输出会传到 stdout 上(就像一

个标准 UNIX 工具所做的那样), 然后重新将这些输出保存到变量中.

7. 对于命令替换来说, $(COMMAND)形式已经取代了后置引用"`".

8. $(...)形式的命令替换在处理双反斜线(\\)时与`...`形式不同.

9. $(...)形式的命令替换是允许嵌套的.

2.13.2.2.进程替换进程替换进程替换进程替换

进程替换把一个进程的输出提供给另一个进程(换句话说, 它把一个命令的结果发

给了另一个命令)

语法:

>(command)

Page 68: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

<(command)

说明:

1. 它使用/dev/fd/<n>文件将圆括号中的进程处理结果发送给另一个进程。

2. 在"<"或">"与圆括号之间是没有空格的. 如果加了空格, 会产生错误。

2.13.3.案例案例案例案例

步骤一:接受进程

#!/bin/bash

#检测 a 变量是否存在

#注意: 后的空格

#echo "接受进程的输出:$1"

echo "替换进程传递的参数"

a=$(cat $1)

echo $a

步骤二:输出进程

#!/bin/bash

#检测 a 变量是否存在

#注意: 后的空格

echo "Hello Shell Programming"

步骤三:

sh12.sh <(sh12_1.sh)

替换的结果是通过/dev/fd/(n)的某文件进行交换的。

2.13.4.课堂练习课堂练习课堂练习课堂练习

Page 69: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

3.Bash Shell编程高级应用编程高级应用编程高级应用编程高级应用

3.1.grep 与与与与正则表达式正则表达式正则表达式正则表达式

3.1.1.目的

技术

1. 掌握正则表达式语法。

2. 掌握 grep 的使用。

技能

1. 能熟练使用 grep 的技巧。

3.1.2.知识点说明

3.1.2.1.理解正则表达式的作用

3.1.2.2.正则表达式的特殊字符

3.1.2.3.基本和扩展正则表达式

3.1.2.4.字符族

3.1.2.5.BASH 中使用正则模式匹配

3.1.2.6.grep 语法

语法:

grep <options> "Search String" [filename]

grep <options> [-e pattern] [file...]

grep <options> [-f file] [file...]

选项:

1. -A NUM,--after-context=NUM

除了列出符合行之外,并且列出後 NUM 行。

ex: $ grep -A 1 panda file

(从 file 中搜寻有 panda 样式的行,并显示该行的後 1 行)

2. -a 或--text

grep 原本是搜寻文字档,若拿二进位的档案作为搜寻的目标,

则会显示如下的讯息: Binary file 二进位档名 matches 然後结束。

若加上-a 参数则可将二进位档案视为文字档案搜寻,

相当於--binary-files=text 这个参数。

ex: (从二进位档案 mv 中去搜寻 panda 样式)

(错误!!!)

$ grep panda mv

Page 70: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

Binary file mv matches

(这表示此档案有 match 之处,详见--binary-files=TYPE )

$

(正确!!!)

$ grep -a panda mv

3. -B NUM,--before-context=NUM

与 -A NUM 相对,但这此参数是显示除符合行之外

并显示在它之前的 NUM 行。

ex: (从 file 中搜寻有 panda 样式的行,并显示该行的前 1 行)

$ grep -B 1 panda file

4. -C [NUM], -NUM, --context[=NUM]

列出符合行之外并列出上下各 NUM 行,预设值是 2。

ex: (列出 file 中除包含 panda 样式的行外并列出其上下 2 行)

(若要改变预设值,直接改变 NUM 即可)

$ grep -C[NUM] panda file

5. -b, --byte-offset

列出样式之前的内文总共有多少 byte ..

ex: $ grep -b panda file

显示结果类似於:

` 0:panda

66:pandahuang

123:panda03

6. --binary-files=TYPE

此参数 TYPE 预设为 binary(二进位),若以普通方式搜寻,只有 2 种结果:

1.若有符合的地方:显示 Binary file 二进位档名 matches

2.若没有符合的地方:什麽都没有显示。

若 TYPE 为 without-match,遇到此参数,

grep 会认为此二进位档案没有包含任何搜寻样式,与-I 参数相同。

若 TPYE 为 text, grep 会将此二进位档视为 text 档案,与-a 参数相同。

注意: --binary-files=text 若输出为终端机,可能会产生一些不必要的输

出。

7. -c, --count

不显示符合样式行,只显示符合的总行数。

若再加上-v,--invert-match,参数显示不符合的总行数。

8. -d ACTION, --directories=ACTION

若输入的档案是一个资料夹,使用 ACTION 去处理这个资料夹。

预设 ACTION 是 read(读取),也就是说此资料夹会被视为一般的档案;

若 ACTION 是 skip(略过),资料夹会被 grep 略过:

若 ACTION 是 recurse(递),grep 会去读取资料夹下所有的档案,

此相当於-r 参数。

9. -E, --extended-regexp

采用规则表示式去解释样式。

10. -e PATTERN, --regexp=PATTERN

把样式做为一个 partern,通常用在避免 partern 用-开始。

Page 71: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

11. -f FILE, --file=FILE

事先将要搜寻的样式写入到一个档案,一行一个样式。然後采用档案搜寻。

空的档案表示没有要搜寻的样式,因此也就不会有任何符合。

ex: (newfile 为搜寻样式档)

$grep -f newfile file

12. -G, --basic-regexp

将样式视为基本的规则表示式解释。(此为预设)

13. -H, --with-filename

在每个符合样式行前加上符合的档案名称,若有路径会显示路径。

ex: (在 file 与 testfile 中搜寻 panda 样式)

$grep -H panda file ./testfile

file:panda

./testfile:panda

$

14. -h, --no-filename

与-H 参数相类似,但在输出时不显示路径。

15. --help

产生简短的 help 讯息。

16. -I

grep 会强制认为此二进位档案没有包含任何搜寻样式,

与--binary-files=without-match 参数相同。

ex: $ grep -I panda mv

17. -i, --ignore-case

忽略大小写,包含要搜寻的样式及被搜寻的档案。

ex: $ grep -i panda mv

18. -L, --files-without-match

不显示平常一般的输出结果,反而显示出没有符合的档案名称。

19. -l, --files-with-matches

不显示平常一般的输出结果,只显示符合的档案名称。

20. --mmap

如果可能,使用 mmap 系统呼叫去读取输入,而不是预设的 read 系统

呼叫。

在某些状况,--mmap 能产生较好的效能。 然而,--mmap

如果运作中档案缩短,或 I/O 错误发生时,

可能造成未定义的行为(包含 core dump)。

21. -n, --line-number

在显示行前,标上行号。

ex: $ grep -n panda file

显示结果相似於下:

行号:符合行的内容

22. -q, --quiet, --silent

不显示任何的一般输出。请参阅-s 或--no-messages

23. -r, --recursive

递地,读取每个资料夹下的所有档案,此相当於 -d recsuse 参数。

Page 72: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

24. -s, --no-messages

不显示关於不存在或无法读取的错误讯息。

25. -V, --version

显示出 grep 的版本号到标准错误。

当您在回报有关 grep 的 bugs 时,grep 版本号是必须要包含在内的。

26. -v, --invert-match

显示除搜寻样式行之外的全部。

27. -w, --word-regexp

将搜寻样式视为一个字去搜寻,完全符合该"字"的行才会被列出。

28. -x, --line-regexp

将搜寻样式视为一行去搜寻,完全符合该"行"的行才会被列出。

3.1.2.7.在 grep 中使用正则模式匹配

3.1.2.7.grep 与管道符

3.1.3.案例

3.1.4.课堂练习

3.2.SED 流编辑流编辑流编辑流编辑

3.1.1.目的

3.1.2.知识点说明

3.1.3.案例

3.1.4.课堂练习

3.3.awk 调用调用调用调用

3.1.1.目的

Page 73: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

3.1.2.知识点说明

3.1.3.案例

3.1.4.课堂练习

3.4.Shell 扩展扩展扩展扩展

3.1.1.目的

3.1.2.知识点说明

3.1.3.案例

3.1.4.课堂练习

Page 74: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

附录附录附录附录

BASH 系统环境变量参考系统环境变量参考系统环境变量参考系统环境变量参考

Bash 和 Bourne shell 以同一种方法来使用特定的 shell 变量。某些情况下,

Bash 为变量分配一个默认的值。下表给出一个简单的 shell 变量的概览:

1.保留的保留的保留的保留的 Bourne shell 变量变量变量变量

变量名字变量名字变量名字变量名字 定义定义定义定义

CDPATH 一个由冒号分割的目录列表作为内建命令 cdcdcdcd 的搜索路径。

HOME 当前用户的 home 目录;默认为内建命令 cdcdcdcd 。这个变量的值同样被~扩展使用。

IFS 分割域的一个字符的列表;用于 shell 把词分开作为扩展。

MAIL 如果这个变量设成一个文件名并且 MAILPATH 变量没有设置,Bash 在指定文件

中通知用户邮件的到达。

MAILPATH 一个用冒号分隔的文件名列表,shell 周期性地从这个文件里检测新邮件。

OPTARG getoptsgetoptsgetoptsgetopts 内建命令处理的最后的选项参数的值。

OPTIND 最后一个由 getoptsgetoptsgetoptsgetopts 内建命令处理的选项参数的索引号。

PATH 一个用冒号分隔的目录列表,shell 从这些目录里寻找命令。

PS1 主要提示符。默认值是 “'\s-\v\$ '”。

PS2 次要提示符。默认值是 “'> '”。

2. Bash保留变量保留变量保留变量保留变量

这些变量是设置好的或者被 Bash 使用的,但是其他 shell 通常不会对它们进行

特殊处理。

保留保留保留保留 BashBashBashBash 变量变量变量变量

变量名变量名变量名变量名 定义定义定义定义

auto_resume 这个变量控制 shell 如何与用户交互和作业控制。

BASH 用于执行当前 Bash 实例的全路径。

BASH_ENV 如果这个变量在 Bash 调用执行一个 shell 脚本时已被设置,

它的值将被展开并用作在执行脚本前读取的启动文件名。

BASH_VERSION 当前 Bash 实例的版本号。

BASH_VERSINFO 一个只读变量数组,它的成员保存这个 Bash 实例的版本信息。

COLUMNS selectselectselectselect 内建命令来决定打印选择列表时终端宽度。在收到

Page 75: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

变量名变量名变量名变量名 定义定义定义定义

SIGWINCH 信号时自动设置。

COMP_CWORD

包含当前光标位置的字的 ${COMP_WORDS} 的一个索引。An

index into ${COMP_WORDS} of the word containing the

current cursor position.

COMP_LINE 当前命令行。

COMP_POINT 指明相对于当前命令起点的当前光标位置。

COMP_WORDS 一个由当前命令行中单个词组成的变量数组。

COMPREPLY

一个变量数组,Bash 从中读取由一个可编程完整设备调用的一

个 shell 函数生成的可能的完成。An array variable from

which Bash reads the possible completions generated by

a shell function invoked by the programmable completion

facility.

DIRSTACK 一个保存当前目录栈内容的变量数组。

EUID 当前用户的数字有效用户 ID。

FCEDIT 内建命令 fcfcfcfc 使用 -e 选项时默认使用的编辑器。

FIGNORE 一个由冒号分隔的在补全文件名时要忽略的后缀列表。

FUNCNAME 任意当前正在执行的 shell 函数名。

GLOBIGNORE 一个由冒号分隔的模板列表,定义在文件名展开时忽略的文件

名集。

GROUPS 一个数组变量,包含当前用户作为成员的组的列表。

histchars 共有三个字符控制历史展开、快速替换和 标记。

HISTCMD 当前命令的历史数字,或者在历史列表里的索引。

HISTCONTROL 定义一个命令是否加入到历史列表中。

HISTFILE 保存历史命令的文件名。默认值是 ~/.bash_history。

HISTFILESIZE 在历史文件中包含的最大行数,默认为 500。

HISTIGNORE 一个由冒号分隔的模式列表,用来决定哪些命令行应该保存在

历史列表中。

HISTSIZE 在历史列表中记录的最大命令数,默认为 500。

HOSTFILE 包含与 /etc/hosts 格式相同的文件名,shell 需要补全主机

名时读取。

HOSTNAME 当前主机的名字。

HOSTTYPE 一个描述运行 Bash 的机器的字符串。

IGNOREEOF 控制 shell 接收到一个 EOF 字符作为独立输入的行为。

INPUTRC Readline 初始化文件的名字,取代默认值为 /etc/inputrc。

LANG

用于为任意没有特别选择用 LC_开头的变量指明的设置决定场

合设置。Used to determine the locale category for any

category not specifically selected with a variable

starting with LC_.

LC_ALL 这个变量取代 LANG 的值并为任意其他 LC_ 变量指定一个区

域种类。

Page 76: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

变量名变量名变量名变量名 定义定义定义定义

LC_COLLATE

这 个变量决定搜索文件名展开结果时使用的整理顺序,并决

定在文件名展开和模式匹配里区域表达、等价类和处理序列的

表现。This variable determines the collation order used

when sorting the results of file name expansion, and

determines the behavior of range expressions,

equivalence classes, and collating sequences within file

name expansion and pattern matching.

LC_CTYPE 这个变量决定在文件名展开和模板匹配里字符的解释和字符

集的行为。

LC_MESSAGES 这个变量决定用于转换由 “$” 引导的双引号字符串的区

域。

LC_NUMERIC 这个变量决定数字格式化的本地类别。

LINENO 当前执行的脚本或者 shell 函数的行数。

LINES 内建命令 selectselectselectselect 用来决定打印选择列表的列长度。

MACHTYPE 一个以标准的 GNU CPU-COMPANY-SYSTEM 格式来充分描述运行

Bash 的系统的类型的字符串。

MAILCHECK shell 从 MAILPATH 或 MAIL 变量里指定的文件中检查邮件的

频度(秒)。

OLDPWD 内建命令 cdcdcdcd 设置的之前的工作目录。

OPTERR 如果设置成 1,Bash 显示内建命令 getoptsgetoptsgetoptsgetopts 生成的错误信息。

OSTYPE 一个描述运行 Bash 的操作系统的字符串。

PIPESTATUS 一个数组变量,包含一个最近运行过的前台管道(可能只包含

一个命令)进程的退出状态值的列表。

POSIXLY_CORRECT 如果这个变量在 bashbashbashbash 启动的时候存在于环境变量中,shell

将进入 POSIX 模式。

PPID shell 父进程的进程 ID。

PROMPT_COMMAND 如果设置了,这个值解释为一个在打印每个基本提示符(PS1)

之前执行的命令。

PS3 这个变量的值被用作 selectselectselectselect 命令的提示符。默认值是

“'#? '”。

PS4 这个值在 -x 选项启用时,在命令行前打印的提示符。

PWD 内建命令 cdcdcdcd 设置的当前工作目录。

RANDOM 每次这个参数被引用时,生成一个 0 和 32767 之间的随机整数。

给这个变量指定一个值作为随机数生成器的种子。

REPLY 内建命令 readreadreadread 的默认值。

SECONDS 这个变量扩展为 shell 运行的秒数。

SHELLOPTS 一个由冒号分隔的 shell 已经启用的选项列表。

SHLVL 新的 Bash 实例启动就增加一。

TIMEFORMAT 这个参数的值用来作为一个格式化的字符串用来指定以 timetimetimetime

保留字作为前缀的管道定时信息如何显示。

TMOUT 如果设成一个大于 0 的值。 TMOUT 作为内建命令 readreadreadread 的默

Page 77: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

变量名变量名变量名变量名 定义定义定义定义

认超时时间。在一个交互 shell 中,当 shell 处于交互状态时,

这个值作为等待在基本提示串后输入的秒数。 在这个秒数后

如果没有输入 Bash 就终止。

UID 数值,当前用户的真实用户 ID。

检查 Bash 的手册,信息或者文档页面得到更多扩展信息。一些变量是只读的,

一些是自动设置的,另外一些如果设置了一个不同的值会失去原有的含义。

PS 特殊转义字符特殊转义字符特殊转义字符特殊转义字符

\a an ASCII bell character (07)

\d the date in "Weekday Month Date" format (e.g.,

"Tue May 26")

\D{format}

the format is passed to strftime(3) and the result

is inserted into the prompt string; an empty for-

mat results in a locale-specific time representa-

tion. The braces are required

\e an ASCII escape character (033)

\h the hostname up to the first `.'

\H the hostname

\j the number of jobs currently managed by the shell

\l the basename of the shell's terminal device name

\n newline

\r carriage return

\s the name of the shell, the basename of $0 (the

portion following the final slash)

\t the current time in 24-hour HH:MM:SS format

\T the current time in 12-hour HH:MM:SS format

\@ the current time in 12-hour am/pm format

\A the current time in 24-hour HH:MM format

\u the username of the current user

\v the version of bash (e.g., 2.00)

\V the release of bash, version + patch level (e.g.,

2.00.0)

\w the current working directory, with $HOME abbrevi-

ated with a tilde

\W the basename of the current working directory,

with $HOME abbreviated with a tilde

\! the history number of this command

\# the command number of this command

Page 78: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

\$ if the effective UID is 0, a #, otherwise a $

\nnn the character corresponding to the octal number

nnn

\\ a backslash

\[ begin a sequence of non-printing characters, which

could be used to embed a terminal control sequence

into the prompt

\] end a sequence of non-printing characters

BASH 转义字符转义字符转义字符转义字符

\a alert (bell)

\b backspace

\e an escape character

\f form feed

\n new line

\r carriage return

\t horizontal tab

\v vertical tab

\\ backslash

\' single quote

\nnn the eight-bit character whose value is the octal

value nnn (one to three digits)

\xHH the eight-bit character whose value is the hexade-

cimal value HH (one or two hex digits)

\cx a control-x character

内建命令内建命令内建命令内建命令(补充补充补充补充)

printf

老版本的 Bash 可能不支持 printf

语法:printf format [argument]...

格式:格式字符的含义:

\" double quote

\0NNN character with octal value NNN (0 to 3 digits)

\\ backslash

\a alert (BEL)

\b backspace

\c produce no further output

\f form feed

Page 79: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

\n new line

\r carriage return

\t horizontal tab

\v vertical tab

\xNNN byte with hexadecimal value NNN (1 to 3 digits)

\uNNNN character with hexadecimal value NNNN (4 digits)

\UNNNNNNNN character with hexadecimal value NNNNNNNN (8 digits)

%% a single %

%b ARGUMENT as a string with `\' escapes interpreted

%Wd Integer `W' digits wide xxxx

%W.De Scientific notation x.xxxx e nnn. float, double

%W.Df Fixed format xx.xxxx. float, double

%W.Dg Variable `W' digits wide,`D' decimals xxxx.xx

%q Output the corresponding argument in a format that can be reused

as shell input

%s Character string char

特殊的特殊的特殊的特殊的 shell 变量变量变量变量

变量变量变量变量 含义含义含义含义

$0 脚本名字

$1 位置参数 #1

$2 - $9 位置参数 #2 - #9

${10} 位置参数 #10

$# 位置参数的个数

"$*" 所有的位置参数(作为单个字符串) *

"$@" 所有的位置参数(每个都作为独立的字符串)

${#*} 传递到脚本中的命令行参数的个数

${#@} 传递到脚本中的命令行参数的个数

$? 返回值

$$ 脚本的进程 ID(PID)

$- 传递到脚本中的标志(使用 set)

$_ 之前命令的最后一个参数

$! 运行在后台的最后一个作业的进程 ID(PID)

测试操作测试操作测试操作测试操作: 二元比较二元比较二元比较二元比较

操作操作操作操作 描述描述描述描述 -------------------- 操作操作操作操作 描述描述描述描述

Page 80: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

操作操作操作操作 描述描述描述描述 -------------------- 操作操作操作操作 描述描述描述描述

算术比较 字符串比较

-eq 等于 = 等于

== 等于

-ne 不等于 != 不等于

-lt 小于 \< 小于 (ASCII) *

-le 小于等于

-gt 大于 \> 大于 (ASCII) *

-ge 大于等于

-z 字符串为空

-n 字符串不为空

算术比较 双括号(( ... ))结构

> 大于

>= 大于等于

< 小于

<= 小于等于

**** 如果在双中括号 [[ ... ]] 测试结构中使用的话, 那么就不需要使用转义符\

了.

文件类型的测试操作文件类型的测试操作文件类型的测试操作文件类型的测试操作

操作操作操作操作 测试条件测试条件测试条件测试条件 ----- 操作操作操作操作 测试条件测试条件测试条件测试条件

-e 文件是否存在 -s 文件大小不为 0

-f 是一个标准文件

-d 是一个目录 -r 文件具有读权限

-h 文件是一个符号链接 -w 文件具有写权限

-L 文件是一个符号链接 -x 文件具有执行权限

-b 文件是一个块设备

-c 文件是一个字符设备 -g 设置了 sgid标记

-p 文件是一个管道 -u 设置了 suid标记

-S 文件是一个 socket -k 设置了"粘贴位"

-t 文件与一个终端相关联

-N 从这个文件最后一次被读取之后, F1 -nt 文件 F1 比文件 F2 新 *

Page 81: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

操作操作操作操作 测试条件测试条件测试条件测试条件 ----- 操作操作操作操作 测试条件测试条件测试条件测试条件

它被修改过 F2

-O 这个文件的宿主是你 F1 -ot

F2 文件 F1 比文件 F2 旧 *

-G 文件的组 id与你所属的组相同 F1 -ef

F2

文件 F1和文件 F2都是同一个文件

的硬链接 *

! "非" (反转上边的测试结果)

参数参数参数参数替换和扩展替换和扩展替换和扩展替换和扩展

表达式表达式表达式表达式 含义含义含义含义

${var} 变量 var 的值, 与$var 相同

${var-DEFAULT} 如果 var 没有被声明, 那么就以$DEFAULT 作为其值 *

${var:-DEFAULT} 如果 var 没有被声明, 或者其值为空, 那么就以$DEFAULT 作

为其值 *

${var=DEFAULT} 如果 var 没有被声明, 那么就以$DEFAULT 作为其值 *

${var:=DEFAULT} 如果 var 没有被声明, 或者其值为空, 那么就以$DEFAULT 作

为其值 *

${var+OTHER} 如果 var 声明了, 那么其值就是$OTHER, 否则就为 null 字符

${var:+OTHER} 如果 var 被设置了, 那么其值就是$OTHER, 否则就为 null 字

符串

${var?ERR_MSG} 如果 var 没被声明, 那么就打印$ERR_MSG *

${var:?ERR_MSG} 如果 var 没被设置, 那么就打印$ERR_MSG *

${!varprefix*} 匹配之前所有以 varprefix 开头进行声明的变量

${!varprefix@} 匹配之前所有以 varprefix 开头进行声明的变量

字符串操作字符串操作字符串操作字符串操作

表达式表达式表达式表达式 含义含义含义含义

Page 82: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

表达式表达式表达式表达式 含义含义含义含义

${#string} $string 的长度

${string:position} 在$string 中, 从位置$position 开始

提取子串

${string:position:length} 在$string 中, 从位置$position 开始

提取长度为$length 的子串

${string#substring} 从变量$string 的开头, 删除最短匹配

$substring 的子串

${string##substring} 从变量$string 的开头, 删除最长匹配

$substring 的子串

${string%substring} 从变量$string 的结尾, 删除最短匹配

$substring 的子串

${string%%substring} 从变量$string 的结尾, 删除最长匹配

$substring 的子串

${string/substring/replacement} 使用$replacement, 来代替第一个匹配

的$substring

${string//substring/replacement} 使用$replacement, 代替所有匹配的

$substring

${string/#substring/replacement}

如果$string 的前缀匹配$substring,

那么就用$replacement 来代替匹配到

的$substring

${string/%substring/replacement}

如果$string 的后缀匹配$substring,

那么就用$replacement 来代替匹配到

的$substring

expr match "$string" '$substring' 匹配$string 开头的$substring*的长

expr "$string" : '$substring' 匹配$string 开头的$substring*的长

expr index "$string" $substring 在$string 中匹配到的$substring 的第

一个字符出现的位置

expr substr $string $position

$length

在$string 中从位置$position 开始提

取长度为$length 的子串

expr match "$string" 从$string 的开头位置提取

Page 83: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

表达式表达式表达式表达式 含义含义含义含义

'\($substring\)' $substring*

expr "$string" : '\($substring\)' 从$string 的开头位置提取

$substring*

expr match "$string"

'.*\($substring\)' 从$string 的结尾提取$substring*

expr "$string" : '.*\($substring\)' 从$string 的结尾提取$substring*

一些结构的汇总一些结构的汇总一些结构的汇总一些结构的汇总

表达式表达式表达式表达式 解释解释解释解释

中括号

if [ CONDITION ] 测试结构

if [[ CONDITION ]] 扩展的测试结构

Array[1]=element1 数组初始化

[a-z] 正则表达式的字符范围

大括号

${variable} 参数替换

${!variable} 间接变量引用

{ command1; command2; . . . commandN; } 代码块

{string1,string2,string3,...} 大括号扩展

圆括号

( command1; command2 ) 子 shell 中执行的命令组

Array=(element1 element2 element3) 数组初始化

result=$(COMMAND) 在子 shell 中执行命令, 并将结果赋值给

变量

>(COMMAND) 进程替换

<(COMMAND) 进程替换

双圆括号

(( var = 78 )) 整型运算

var=$(( 20 + 5 )) 整型运算, 并将结果赋值给变量

引号

Page 84: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

表达式表达式表达式表达式 解释解释解释解释

"$variable" "弱"引用

'string' "强"引用

后置引用

result=`COMMAND` 在子 shell 中运行命令, 并将结果赋值给

变量

Bash set 选项选项选项选项

缩写缩写缩写缩写 名称名称名称名称 作用作用作用作用

-C noclobber 防止重定向时覆盖文件(可能会被>|覆盖)

-D (none) 列出用双引号引用起来的, 以$为前缀的字符串, 但是不执行

脚本中的命令

-a allexport export(导出)所有定义过的变量

-b notify 当后台运行的作业终止时, 给出通知(脚本中并不常见)

-c ... (none) 从...中读取命令

-e errexit

当脚本发生第一个错误时, 就退出脚本, 换种说法就是, 当一

个命令返回非零值时, 就退出脚本(除了 until 或 while loops,

if-tests, list constructs)

-f noglob 禁用文件名扩展(就是禁用 globbing)

-i interactive 让脚本以交互模式运行

-n noexec 从脚本中读取命令, 但是不执行它们(做语法检查)

-o

Option-Name (none) 调用Option-Name选项

-o posix POSIX 修改 Bash 或被调用脚本的行为, 使其符合 POSIX 标准.

-p privileged 以"suid"身份来运行脚本(小心!)

-r restricted 以受限模式来运行脚本(参考 21).

-s stdin 从 stdin 中读取命令

-t (none) 执行完第一个命令之后, 就退出

-u nounset 如果尝试使用了未定义的变量, 就会输出一个错误消息, 然后

强制退出

-v verbose 在执行每个命令之前, 把每个命令打印到 stdout 上

-x xtrace 与-v 选项类似, 但是会打印完整命令

- (none) 选项结束标志. 后面的参数为位置参数.

Page 85: ShellShell编程 编程 - pudn.comread.pudn.com/downloads167/sourcecode/windows/shell/766547/Shell.pdf修订历史 摘要 日期 修改原因 版本 文档创建 2009-4-10 新建 1.0

缩写缩写缩写缩写 名称名称名称名称 作用作用作用作用

-- (none) unset(释放)位置参数. 如果指定了参数列表(-- arg1 arg2),

那么位置参数将会依次设置到参数列表中.