第十三章 阅读shell脚本
翻译:hfzheng
hfzheng@sohu.com
转载请保留此信息
基本的shell脚本
一个shell脚本是一个ASCII文件,包含了一系列的命令以及注释。
注释是文档中的文本,用来说明脚本的功能以及每一行脚本执行完后需要完成的功能,注释以#开头。
确定shell脚本类型
脚本最上面一行说明执行脚本的shell程序类型,例如,对于Bourn shell而言,第一行应该是:
#!/bin/sh
内核使用#!来识别用来翻译脚本的程序。
备注:korn shell的第一行应该为#!/bin/ksh,c shell的第一行应该为#!/bin/csh。
不过,并不是所有的shell脚本使用最上面一行来识别shell程序。
一些脚本可以在最上面有一个基本的文本注释。和父shell同样的shell来执行该脚本。一些脚本可能在最上面没有注释。在这种情况下,则使用默认的shell程序来执行该脚本。
创建一个基本的shell脚本
创建一个基本的shell脚本使用以下步骤:
1、使用vi编辑器,创建一个文件,名为my.script,输入命令,后跟tab键,然后以#开头定义注释;
2、使文件可以执行,然后在命令行方式下输入该文件的命令。
$ vi my.script
who # To view who is logged on the system.
date # To view the current date and time
ls -l # To view files in current directory
:wq
$ chmod 755 my.script
$./my.script
Bourne shell编程
用于管理Solaris操作环境的标准管理脚本是bourne shell脚本。
为了成功控制、修改操作环境的行为,系统管理员必须可以读、修改和定制这些不同的shell脚本文件。
通常,所有的Bourne shell脚本包括了一组UNIX命令、Bourne shell内建命令、编程结构和注释。
Bourne shell脚本
要能够阅读,更重要的是理解基本shell脚本的内容,必须能够:
1、能够理解参数如何传给脚本,通过使用特殊的称为位置变量的内建变量传递;
2、能够识别和分析简单的条件结构和流程控制;
特殊的shell内建变量
位置参数
特殊的shell内建变量称为位置参数,用于从命令行中传递参数给脚本。
在命令行方式下,跟在脚本名称后的用空格分割的每个单词,称为参数,这些参数在shell脚本中称为位置参数。
命令格式
scriptname argument1 argument2 argument3 ...
当脚本执行时,shell自动存储命令行中的第一个参数到位置参数$1中,第二个参数到位置参数$2中,第三个参数到位置参数#3中,依此类推。
重置一个位置参数
set命令用于重置位置参数。
下面示例描述如何使用set命令来设置位置参数。
首先执行带选项-m的who命令,查看输出:
$ who -m
user1 pts/5 Mar 13 11:43 (host1)
$
现在使用cat命令创建shell脚本,命名为my.script3:
$ vi my.script3
#!/bin/sh
set ‘who -m‘
echo Here are the positional variables that have been set:
echo The first is: $1
echo The second is: $2
echo The third is: $3
echo The fourth is: $4
echo The fifth is: $5
echo The sixth is: $6
echo This script is: $0
$ ^d
使用chmod命令使脚本可以执行:
$ chmod 755 script3
$
执行新脚本:
$ my.script3
Here are the positional variables that have been set:
The first is: user1
The second is: pts/5
The third is: Mar
The fourth is: 13
The fifth is: 11:43
The sixth is: (host1)
This script is: my.script3
$
Bourne shell最多允许使用9个位置参数,$1到$9。脚本名称另外放在参数$0的引用中。
位置参数含义
$1到$9引用$1到$9位置参数
$0 引用当前shell脚本名称
另外两个有用的位置参数是$#和$@。
1、$#:返回存储在$1到$9位置参数的命令行参数总数;
2、$@:展开位置参数,显示每个存储的参数;
下面的示例说明脚本中位置参数的作用。
创建名为my.script4的脚本,更改属性为可执行。
$ vi my.script4
#!/bin/sh
echo The script name is: $0
echo
echo The first argument passed is: $1
echo The second argument passed is: $2
echo
echo The highest numbered parameter is: $#
echo The parameters passed to the script are: $@
^d
$ chmod 755 script4
$
执行新脚本,带stop和start参数。
$ my.script4 start stop
The script name is: my.script4
The first argument passed is: start
The second argument passed is: stop
The highest numbered parameter is: 2
The parameters passed to the script are: start stop
$
条件结构和流程控制
条件命令
条件命令允许你基于一个条件真假来执行相应的任务。最简单的条件命令是if命令。
If命令可以测试条件,根据条件测试的结果,来改变脚本执行的流程。
命令格式
if command
then
command
command
fi
退出状态
当程序完成执行后(命令行或者脚本),返回一个退出状态,然后回到shell,一个退出状态是一个0到255的整数。
根据上面给出的通用命令格式,if结构之后的命令被执行,并返回退出状态。如果退出状态为0在then和fi结构之间的命令被执行,fi终止if块。
但是,如何第一个命令执行后,退出状态非零,表示命令失败,then关键字以后的语句被忽略,流程之间跳到fi语句后面。
无效的参数传递、检测到错误条件都可以引起命令失败。
Shell变量$?由shell自动设置最后执行的命令的退出状态,echo命令可以显示参数值。
下面的示例描述了如何在命令行方式下查看一个成功和不成功的命令执行的退出状态。
$ mkdir newdir
$
$ echo $?
0
$
$ mkdir
mkdir: Failed to make directory "newdir"; File exists
$ echo $?
127
$
test命令
内建的test命令通常紧跟if命令使用。
Test命令用来计算表达式的值,如果结果为真,返回零退出状态,如果结果为假,返回非零退出状态。
命令格式
if test expression
then
command
fi
下面示例用于测试变量$name是否已经被预先设置为值user2?
if test "$name" = "user2"
then
echo "matches"
fi
等号操作符用于测试两个值是否一样?也就是说,test命令用来测试$name变量是否为字符串user2,如果是的话,返回零退出状态,否则返回非零退出状态。
test的另外一种格式