Bourne Shell及shell编程Word格式.docx
《Bourne Shell及shell编程Word格式.docx》由会员分享,可在线阅读,更多相关《Bourne Shell及shell编程Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
cd,更改PATH,指定全路径名,输出重定向,因此可以提供一个较
好的控制和安全机制。
通常rsh用于应用型用户及拨号用户,这些用户通常是看不到提
示符的。
通常受限制用户的主目录是不可写的。
不足:
如果用户可以调用sh,则rsh的限制将不在起作用,事实上如果用户在vi及more
程序中调用shell,而这时rsh的限制将不再起作用。
(4)用set改变shell选项
用户可以在$提示符下用set命令来设置或取消shell的选项。
使用-设置选项,+取消相应
选项,大多数UNIX系统允许a,e,f,h,k,n,u,v和x的开关设置/取消。
set-xv
启动跟踪方式;
显示所有的命令及替换,同样显示输入。
set-tu
关闭在替换时对未定义变量的检查。
使用echo$-显示所有已设置的shell选项。
(5)用户启动文件.profile
PATH=$PATH:
/usr/loacl/bin;
exportPATH
(6)shell环境变量
CDPATH用于cd命令的查找路径
HOME/etc/passwd文件中列出的用户主目录
IFSInternalFieldSeparator,默认为空格,tab及换行符
MAIL/var/mail/$USERNAMEmail等程序使用
PATH
PS1,PS2默认提示符($)及换行提示符(>
)
TERM终端类型,常用的有vt100,ansi,vt200,xterm等
示例:
$PS1="
test:
"
;
exportPS1
PS1="
\$"
$echo$MAIL
/var/mail/username
(7)保留字符及其含义
$shell变量名的开始,如$var
|管道,将标准输出转到下一个命令的标准输入
#注释开始
&
在后台执行一个进程
?
匹配一个字符
*匹配0到多个字符(与DOS不同,可在文件名中间使用,并且含.)
$-使用set及执行时传递给shell的标志位
$!
最后一个子进程的进程号
$#传递给shellscript的参数个数
$*传递给shellscript的参数
$@所有参数,个别的用双引号括起来
$?
上一个命令的返回代码
$0当前shell的名字
$n(n:
1-)位置参数
$$进程标识号(ProcessIdentifierNumber,PID)
>
file输出重定向
`command`命令替换,如filename=`basename/usr/local/bin/tcsh`
fiile输出重定向,append
转义符及单引号:
$echo"
$HOME$PATH"
/home/hbwork/opt/kde/bin:
/usr/local/bin:
/bin:
/usr/bin:
/usr/X11R6/bin:
$echo'
$HOME$PATH'
$HOME$PATH
$echo\$HOME$PATH
$HOME/opt/kde/bin:
/home/hbwork/bin
其他:
$dir=ls
$$dir
$aliasdirls
$dir
ls>
filelist
wc-l<
wc-lfilelist
sleep5;
echo5secondsreaches;
ls-l
psax|egrepinetd
find/-namecore-execrm{}\;
&
filename=`date"
+%Y%m%d"
`.log
2.shell变量
变量:
代表某些值的符号,如$HOME,cd命令查找$HOME,在计算机语言中可以使用变量可以
进行多种运算和控制。
BourneShell有如下四种变量:
.用户自定义变量
.位置变量即shellscript之参数
.预定义变量(特殊变量)
.环境变量(参考shell定制部分)
(1)用户自定义变量(数据的存储)
$COUNT=1
$NAME="
HeBinwu"
技巧:
因为大部分UNIX命令使用小写字符,因此在shell编程中通常使用全大写变量,
当然这并不是强制性的,但使用大写字符可以在编程中方便地识别变量。
变量的调用:
在变量前加$
$echo$HOME
/home/hbwork
$WEEK=Satur
$echoTodayis$WEEKday
Todayis
$echoTodayis${WEEK}day
TodayisSaturday
Shell变量赋值从右从左进行(LinuxShell/bash从左向右赋值!
$X=$YY=y
$echo$X
y
$Z=zY=$Z
$echo$Y
使用unset命令删除变量的赋值
$Z=hello
$echo$Z
hello
$unsetZ
有条件的命令替换
在BourneShell中可以使变量替换在特定条件下执行,即有条件的环境变量替换。
这种变量替换总是用大括号括起来的。
.设置变量的默认值
在变量未赋值之前其值为空。
BourneShell允许对变量设置默认值,其格式如下:
${variable:
-defaultvalue}
例:
$echoHello$UNAME
Hello
$echoHello${UNAME:
-there}
Hellothere
$echo$UNAME#变量值并未发生变化
$UNAME=hbwork
Hellohbwork
.另一种情况:
改变变量的值,格式如下:
=value}
=there}
there
.变量替换中使用命令替换
$USERDIR=${$MYDIR:
-`pwd`}
.在变量已赋值时进行替换${variable:
+value}
.带有错误检查的有条件变量替换
?
value}
$UNAME=
$echo${UNAME:
UNAMEhasnotbeenset"
}
UNAME:
UNAMEhasnotbeenset
parameternullornotset
(2)位置变量(Shell参数)
在shellscript中位置参数可用$1..$9表示,$0表示内容通常为当前执行程序的文件名。
.防止变量值被替换readonlyvariable
.使用export命令输出变量,使得变量对子shell可用,当shell执行一下程序时,shell
将为其设置一个新的环境让其执行,这称之了subshell.在BourneShell中变量通常
被认为是本地变量,也就是说在对其赋值之外的shell环境之外是不认识此变量的。
使
用export对subshell可用。
对变量PS1的export操作,shell的提示符将发生变化。
$PS1=`hostname`$
peony$sh
$echo$PS1
$<
-输出结果
$exit
peony$exportPS1
peony$echo$PS1
peony$<
peony$
3.ShellScript编程
目的:
使用UNIX所提供的最常用工具来完成所需复杂任务的强大功能。
(1)最简单的Shell编程
$ls-R/|grepmyname|more
每天数据的备份:
$cd/usr/yourname;
ls*|cpio-o>
/dev/rmt/0h
书写程序的目的是一次编程,多次使用(执行)!
$cat>
backup.sh
cd/home/hbwork
ls*|cpio-o>
^D
执行:
$shbackup.sh
或:
$chmod+xbackup.sh
$./backup.sh
在shellscript中加入必要的注释,以便以后阅读及维护。
(2)shell是一个(编程)语言
同传统的编程语言一样,shell提供了很多特性,这些特性可以使你的shellscript
编程更为有用,如:
数据变量、参数传递、判断、流程控制、数据输入和输出,子
程序及以中断处理等。
.在shell编程中使用数据变量可以将程序变量更为通用,如在上面backup.sh中:
cd$WORKDIR
.Shell编程中的注释以#开头
.对shell变量进行数字运算,使用expr命令
exprintegeroperatorinteger
其中operator为+-*/%,但对*的使用要用转义符\,如:
$expr4\*5
20
$int=`expr5+7`
$echo$int
12
(3)Shell编程的参数传递,可通过命令行参数以及交互式输入变量(read)
restoreall.sh对backup.sh程序的备份磁带进行恢复
$cat>
restoreall.sh
cpio-i<
restore1.sh:
只能恢复一个文件
#restore1--programtorestoreasinglefile
cpio-i$i<
$restore1file1
恢复多个文件restoreany:
#restoreany--programtorestoreasinglefile
cpio-i$*<
$restoreanyfile1file2file3
(4)条件判断
.if-then语句,格式如下:
ifcommand_1
then
command_2
command_3
fi
command_4
在if-then语句中使用了命令返回码$?
即当command_1执行成功时才执行command_2和
command_3,而command_4总是执行.
示例程序unload:
在备份成功时删除原始文件,带有错误检查
cd$1
#备份时未考虑不成功的情况!
ls-a|cpio-o>
rm-rf*
改进如下:
#当使用了管道命令时,管理命令的返回代码为最后一个命令的返回代码
ifls-a|cpio-o>
.if-then-else语句
else
技巧:
由于shell对命令中的多余的空格不作任何处理,一个好的程序员会用这一特性
对自己的程序采用统一的缩进格式,以增强自己程序的可读性.
.使用test命令进行进行条件测试
格式:
testconditions
test在以下四种情况下使用:
a.字符比较b.两个整数值的比较
c.文件操作,如文件是否存在及文件的状态等
d.逻辑操作,可以进行and/or,与其他条件联合使用
a.测试字符数据:
shell变量通常民政部下均作为字符变量
str1=str2二者相长,相同
str1!
=str2不同
-nstringstring不为空(长度不为零)
-zstringstring为空
stringstring不为空
例:
$str1=abcd#在含有空格时必须用引号括起来
$test$str1=abcd
$echo$?
0
$str1="
abcd"
1
Note:
在test处理含有空格的变量时最好用引号将变量括起来,否则会出现错误的结果,
因为shell在处理命令行时将会去掉多余的空格,而用引号括起来则可以防止
shell去掉这些空格.
"
$test$str1
$test"
$str1"
$test-n$str1
argumentexpected
$test-n"
b.整数测试:
test与expr相同,可以将字符型变量转换为整数进行操作,expr进行
整数的算术运算,而test则进行逻辑运算.
表达式说明
---------------------------------------
int1-eqint2相等?
int1-neint2不等?
int1-gtint2int1>
int2?
int1-geint2int1>
=int2?
int1-ltint2int1<
int1-leint2int1<
$int1=1234
$int2=01234
$test$int1-eq$int2
c.文件测试:
检查文件状态如存在及读写权限等
-rfilename用户对文件filename有读权限?
-wfilename用户对文件filename有写权限?
-xfilename用户对文件filename有可执行权限?
-ffilename文件filename为普通文件?
-dfilename文件filename为目录?
-cfilename文件filename为字符设备文件?
-bfilename文件filename为块设备文件?
-sfilename文件filename大小不为零?
-tfnumb与文件描述符fnumb(默认值为1)相关的设备是一个终端设备?
d.测试条件之否定,使用!
$cat/dev/null>
empty
$test-rempty
$test-sempty
$test!
-sempty
e.测试条件之逻辑运算
-aAnd
-oOr
$test-rempty-a-sempty
f.进行test测试的标准方法
因为test命令在shell编程中占有很重要的地位,为了使shell能同其他编程语言一样
便于阅读和组织,BourneShell在使用test测试时使用了另一种方法:
用方括号将整个
test测试括起来:
$int1=4
$[$int1-gt2]
重写unload程序,使用test测试
#!
/bin/sh
#unload-programtobackupandremovefiles
#syntax:
unloaddirectory
#checkarguments
if[$#-ne1]
echo"
usage:
$0directory"
exit1
#checkforvaliddirectoryname
if[!
-d"
$1"
]
$1isnotadirectory"
exit2
if[$?
-eq0]
Aproblemhasoccuredincreatingbackup"
Thedirectorywillnotbeereased"
Pleasecheckthebackupdevice"
exit3
#endofunload
在如上示例中出现了exit,exit有两个作用:
一是停止程序中其他命令的执行,二是
设置程序的退出状态
g.if嵌套及elif结构
ifcommand
command
改进:
使用elif结构
elifcommand
elif结构同if结构类似,但结构更清淅,其执行结果完全相同.
BourneShell及shell编程
(2)
BourneShell及Shell编程
(2)
h.交互式从键盘读入数据
使用read语句,其格式如下:
readvar1var2...varn
read将不作变量替换,但会删除多余的空格,直到遇到第一个换行符(回车),
并将输入值依次赋值给相应的变量。
$readvar1var2var3
Hellomyfriends
$echo$var1$var2$var3
$echo$var1
Hellomydearfriends
$echo$var3
dearfriends<
-输入多余变量时,输入值余下的内容赋给最后一个变量
Hellofriends
<
-var3为空
在shellscript中可使用read语句进行交互操作:
...
#echo-nmessage输出结果后不换行
echo-n"
Doyouwanttocontinue:
YorN"
readANSWER
if[$ANSWER=N-o$ANSWER=n]
exit
i.case结构:
结构较elif-then结构更清楚
比较if-then语句:
if[variable1=value1]
elif[variable1=value2]
elif[variable1=value3]
相应的case结构:
casevaluein
pattern1)
command;
pattern2)
patternn)
esac
*case语句只执行第一个匹