循序渐进UNIX--UNIX Shell 程序设计

类别:编程语言 点击:0 评论:0 推荐:

UNIX Shell? 程序设计

http://91mail.51.net提供??需要完整的pdf文档请到http://91mail.51.net下载
??? UNIX? Shell概述
??? Shell启动及其命令
??? Shell命令的集成
??? Shell 变量
??? Shell的控制结构
??? Shell的运行环境
???
?第一节UNIX Shell概述
*? ?什么是 Shell
*? ?Shell的双重特性
*? ?Shell程序语言的特点
*? ?Shell的版本
*? ?Shell版本的选择
什么是 Shell

?? Shell就是UNIX提供用户的使用界面 。
Shell处在内核与外层应用程序之间,起着
协调用户与系统的一致性、在用户与系统
之间进行交互的作用,即 Shell为用户提供
了输入命令和参数并可得到命令执行结果
的环境。
Shell的双重特性
?F? 命令解释程序(命令解释器)
??????? Shell解释用户输入的命令行,提交系统内核
处理,并将结果返回给用户;
??? Shell与UNIX命令一样都是实用程序,但有区
别。一旦用户注册到系统后, Shell 就被系统装
入内存,并一直运行到用户退出系统之止;而一
般命令仅当被调用时,才由系统装入内存执行。
?F? 程序设计语言
??? Shell本身也是一种可编程的程序设计语言。
6.1.1? Shell的特点和主要版本?
???? Shell允许通过编程来完成复杂的功能处理,
但其作为语言与高级语言比较具有不同的特点:
? Shell是解释性的,多数高级语言是编译性的;
?· Shell语言与高级语言处理的对象不同;
?¸ Shell与系统有密切的关系;
?¹ Shell易编写、调试、灵活性较强,但速度低;
?º Shell作为命令级语言,命令组合功能很强。
Shell的版本?
Shell版本的选择
选择Shell版本应考虑的因素:
?? Bourne Shell在任何一个UNIX系统平台上都存在,因此又成为标准Shell;
?·? Bourne Shell家族有更丰富的程序语言,而 C Shell家族有简单的程序接口;
?¸? Shell各类变种功能越来越强大,但学习和使用也越难,因此可依据使用者编程经验来选择;
?¹ Shell编程的脚本是个人使用还是公用,即要
考虑移植性问题。

6.1.2? shell程序示例
6.1.3 shell脚本的建立和执行
第2节 Shell变量
*???? Shell变量
*???? 用户自定义变量
*???? 位置变量
*???? 预定义的特殊变量
*???? 环境变量
*???? 变量替换

?F?? Shell实际上是基于字符串的程序设计语言,
也具有变量。变量的名字必须以字母或下划线
开头,可以包括字母、数字和下划线。
?F?? Shell变量能够而且只能存储正文字符串,
即它只有一种类型的变量——串变量。
?F?? 从赋值的形式上看,则可以分成四种类型
的变量或变量形式。
F? shell有两种变量:环境变量和临时变量。

环境变量:永久变量
???????????????????? 用户自定义变量
??????????????????????? 位置参数


?6.2.1? 用户定义的变量
F?语法格式:变量名=字符串
F?在程序中使用变量时,要在变量名前加一个符号“$”
?F赋值号“=”两边不允许有空白符;
??? nodehost="beijing.UUCP ”
??? path=/bin:/usr/bin:/etc/bin
??? count=10
?F 允许多个赋值操作,按从右到左的顺序进行;
??? # A=$B? B=abc? C="OK"
??? # echo $A $B $C
?????????? abc abc OK
?

?F 当引用一个未设置的变量时,其隐含值为空;
??? # echo? "$mail is path of mailbox”
????????? is path of mailbox
F 如果用双引号“”将值括起来,则括起来的
字符串允许出现空格、制表符和换行符的特殊字
符,而且允许有变量替换。?
?? 例1:# MAIL=/var/mail/fk
???????????? # var="$MAIL is a path of mailbox"
???????????? # echo $var
???????? /var/mail/fk is a path of mailbox
??

例2:# str="This is \n a book"
???????????? # echo $str
???????????? This is
?????????????? a book


?F 如果用单引号‘’将值括起来,则括起来的字符串允许出现空格、制表符和换行符的特殊字符,但不允许有变量替换。?? 例1? # BOOK="English book"
?????????? # MSG='$BOOK'
?????????? # echo $MSG
??????????? $BOOK???
?? 例2?? # msg=' Today is \t Sunday'
?????????? # echo $msg
?????????? Today is???????? Sunday

?F 引用变量的值时,可以用花括号{}将变量名称括起来,使变量名称与它的后续字符分隔开,如果紧跟在变量名称后面的字符是字母、数字或下划线时,必须要使用花括号。?
?? 例: # str='This is a string'
??# echo "${str}ent test of variables"
??This is a stringent test of variables
??# echo "$strent test of variables"
??test of variables
6.2.2输入输出命令
1.read命令
??????? 可以利用read命令由标准输入读取数据,然后赋给指定的变量
格式:read? 变量1 [变量2…]
例如:read name
??????????? read a b c
?

F 若变量数少于数据个数
例如执行 read n1 n2
时,用户输入:
First Second Third \c”
2.3? 位置参数
?????? 位置变量顾名思义是与位置有关的变量,这
是一种特殊的变量。命令行的Shell过程名本身被
指定为位置变量$0,依次参数为$1 …. $9 。
?例:ls???? /?? /bin? /etc? /usr/bin? /dev?? …
???????????? ×???? ×?????? ×?????? ×???????? ×???????????? ×
?? $0?? $1?? $2??? $3???? $4???????? $5??? …
???? 例:# cat? finduser
?????????????? who | grep $1
??????????? # finduser fke

例6-5 位置参数的使用
$ cat m1.c
? main( )
?{
?? printf(“bebin\n”)
?}
$cat m2.c
? #include
? main( )
? {
? Printf(“ok\n”)
? Printf(“end\n”)
? }

$cat ex5
#ex5:shell sript to combine files and count
#lines
????? cat $1 $2 $3 $4 $5 | wc –l
#end
$ ex5 m1.c m2.c
?10

F在shell程序中可以利用set命令为位置参数赋值。例如:
??? set m1.c m2.c m3.c
就把字符串m1.c赋给$1,字符串m2.c赋给$2,字符串m3.c赋给$3。但$0不能用set赋值
例6-6? 用set 设置位置参数值
?$ cat ex6
?? set m1.c m2.c
?? cat $1 $2 $3 $4 $5 | wc-l
$ ex6
10
6.2.5? 预定义的特殊变量
?? 在Shell中有一组特殊的变量,其变量名和变量值只有Shell本身才可以设置。
?F? $#? — 记录传递给Shell的自变量个数;
? 例1: # myprog? a? b? c????????? 则? $#的值为3
? 例2: if? test $#? -lt? 2
?????????? then
???? echo? “two or more args required”
???? exit ?
??????? fi?

例6-2
$ cat ex2
?if test $# = 0
?? then ls
else
??? for i
????? do
????????? ls –l $i
?????? done
fi
2.5? 预定义的特殊变量(续1)
F $? —? 取最近一次命令执行后的退出状态(返???????? 回码) :执行成功返回码为0, 执行失???????? 败返回码为1;
?例:# test? -r? my_file?? (假设my_file文件不可读)????
?? # echo?? $?
??????????? 1
F $$?? —? 当前进程的进程号 ;p142
F $! —? 取最后一个在后台运行的(使用“&”)
????????? 进程的进程号 ;?????????? ??
2.5? 预定义的特殊变量(续2)
?F? $-? —? Shell的标志位,既在Shell启动时使用 的选项,或用set命令方式所提供的选项。
?F? $*? —? 匹配所有位置变量 ; ??
????????? $*??? 匹配?? $1? $2? $3? …
??? ·??? “$*”? 匹配? “$1? $2? $3? …”
?F? $@? —? 匹配所有位置变量 ; ??
????????? $@? 匹配??? $1? $2? $3? …
??? ·??? “$@” 匹配? “$1” “ $2” “$3 ” …
6.2.6? 环境变量
?? Shell执行环境由一系列环境变量组成,这些变
量是由Shell维护和管理的。所有这些变量都可被
用户重新设置,变量名由大写字母或数字组成。
?CDPATH:执行cd命令时使用的搜索路径;
?HOME :用户的home目录;
?IFS?????? :内部的域分隔符,一般为空格符、制表符??????????
???????????????????? 或换行符;
?MAIL?? :?? 指定特定文件(信箱)的路径,供邮件系统用;
?PATH? :寻找命令或可执行文件的搜索路径;
?PS1?????? :?? 主命令提示符,默认为“$ ”或“#”;
?PS2?????? :?? 从命令提示符,默认为“> ”;
?TERM? : 使用的终端类型。p144
6.2.7 export语句与环境设置
????????????????? 局部变量和全局变量
局部变量在某一局部特定环境下使用的变量 。
?F? 注册Shell在接受到用户输入的命令(非内部
命令)后,通常派生出一个子Shell,由此子Shell
负责解释执行该命令。
? F 子Shell有自己的运行环境和变量,这些变量
仅在子Shell的范围内的特定环境下才能使用。
?

F 子Shell不能存取由父Shell设置的局部变量,
也不能改变父Shell的变量值。
例1:? # cat vartest1
??????? echo :$x:
??? ??? # x=100
???? # vartest1
???? ::
? 例2:? # cat vartest2
??? x=60
??? echo :$x:
??? # x=10
??? # vartest2
??? :60:
??? # echo $x
??? 10
全局变量
? ? 全局变量是一种特殊的变量,可以被任何运行
的子Shell来引用。全局变量通过export命令来定
义,格式如下:
??export? variables
其中 variables 是要变成全局变量的变量表名。
?F? 一旦变量被定义为全局变量,则对于以后的
所有子Shell来说这些都是全局变量;
?F? 子Shell中无法改变全局变量的值;
?F? 若在子Shell中改变全局变量的值,实际是对
全局变量的副本进行更改,不影响全局变量值;
?F? 子Shell中局部变量的使用优先于全局变量。

? 例:? # export g_var
??# g _var="GLOBAL"
??# cat test_var
??export g_var l_var
??g_var="sub_shell:g_var"
??l_var="sub_shell:l_var"
??echo $g_var $l_var
??# test_var
??sub_shell:g_var sub_shell:l_var
??# echo $g_var? :$l_var:
??GLOBAL ::
??# ?
局部变量和全局变量作用域
? 任何没有用export命令定义过的变量是局部变
量,子Shell不能存取父Shell的局部变量;
?· 子Shell中可以存取和修改父Shell的全局变量,
但这种修改对于父Shell全局变量没有任何影响;
?¸ 在子Shell中用export命令定义的全局变量和对
此变量的修改对父Shell变量没有影响;
?¹ 全局变量保持它的全局性,不仅能直接传递给
它的子Shell,而且子Shell还能将它传递给子Shell
的子Shell;
?º 在对变量赋值之前和之后的任何时候可以将该
变量转换成全局变量。

1export语句
???? p144
2. .profile文件?????? p145
??? 如果修改了.profile文件需重置环境,即重新执行.profile文件。$ $HOME/.profile
3.环境变量的设置和显示
4.set 命令?????????????????????????


例6-8
$ cat ex8
? set –x
?? a=1;b=5
? echo”current shell flags $-”
?? echo $a $b
? set +x
? echo”current shell flags $-”
? set –v
? A=2;B=8
?echo”current shell flags $-”
?echo $A $B
?set +V
?echo”current shell flags $-”

$ ex8
?a=1
b=5
+ echo current shell flags x
Current shell flags x
+ echo 1 5
1 5
+ set +x
Current shell flags
A=2; B=8
Echo “current shell flags $-”
Current shell flags v
Echo $A $B
2 8
Set +v
Current shell flags


6.3 shell中的特殊字符
3.1??? UNIX元字符(通配符)的定义
?*??? 匹配任何字符串,包括空字符串;
??? 匹配任何单个字符;
? [ … , - , ! ] 按照范围“-”、列表“...”或不匹配
?????????????????????????? “!”等形式匹配指定的字符;
?\???? 转意符,使元字符失去其特殊的含义。??
?例:[a-d,x,y] 匹配字符a、b、c、d、x、y;
????  ?? z*??? 匹配以字符z开始的任何字符串;
?????? x?y?? 匹配以x开始、以y结束、中间为任何?单个字?? ??????? 符的字符串;
????? [!Z] 匹配不为Z的单个字符。?
6.3.1? 元字符(续)
例:[a-f]* 匹配字符a到字符f开头的文件名;
???abc?? d2?? e3.c? f.dat  
 ?  ?*z ?匹配以字符z结尾的任何字符串;
???win.z?? core.zz?? a-c_5z
??rc?.d?匹配以rc开始、以.d结束、中间为任
???何单个字符的文件名;
???rc0.d?? rc2.d? rcS.d
?????? *[!o]? 匹配不以o结尾的文件名;
????
6.3.2? 消除特殊字符的含义可用转义符、单引号和双引号。
?F 双引号 (“”)的引用
?双引号能消除被括在双引号中大部分特殊字符的含义,但不能消除 $ 、` 、"? 、\? 四个字符的其特殊含义:?
?例: vdate=“`date` is system maintenance day !”
F 单引号 (‘’)的引用
?? 消除被括在单引号中的所有特殊字符的含义。
?例:# echo ‘$count=’$count
?F? 转义符( \) 的引用
? 消除紧跟在转义符后面的单个字符的特殊含义 。
??例?? #count=`expr count \* 10`
?
?F 特殊字符串引用的例外
???? 引用双引号、单引号和转意符都不能消除对
echo命令有特殊功能的控制字串(逃逸字符)的
特殊含义。这些控制字串是:
?\b?Backspace
?\c?显示后不换行
?\f?在终端上屏幕的开始处显示
?\n?换行
?\r?回车
?\t?制表符
?\v?垂直制表符
?\?反斜框
6.3.3? 输入、输出重定向符
F? 使用标准改向符进行重定向(改向)?
??? ????????????? 输出改向
????????? >>????? 追加输出改向?
?F 使用标准文件描述字进行重定向(改向)?
?? ??? 在UNIX系统中,使用了文件描述字来定义输入、输出的标准文件,其中:
? 0:标准输入??? 1:标准输出??? 2:标准错误输出
6.3.3? 输入、输出重定向(续1)
?F 标准输入的改向(< 、

本文地址:http://com.8s8s.com/it/it28712.htm