Bourne Shell及shell编程.docx

上传人:b****5 文档编号:5330007 上传时间:2022-12-15 格式:DOCX 页数:26 大小:29.02KB
下载 相关 举报
Bourne Shell及shell编程.docx_第1页
第1页 / 共26页
Bourne Shell及shell编程.docx_第2页
第2页 / 共26页
Bourne Shell及shell编程.docx_第3页
第3页 / 共26页
Bourne Shell及shell编程.docx_第4页
第4页 / 共26页
Bourne Shell及shell编程.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

Bourne Shell及shell编程.docx

《Bourne Shell及shell编程.docx》由会员分享,可在线阅读,更多相关《Bourne Shell及shell编程.docx(26页珍藏版)》请在冰豆网上搜索。

Bourne Shell及shell编程.docx

BourneShell及shell编程

BourneShell及shell编程

(1)

作者:

何斌武(hbwork@,大连理工大学网络中心,April1999.)

  

BourneShell

介绍:

BourneShell基础及其他很多有用的特性,shell编程及组织。

主要内容:

.shell基础基本介绍,环境,选项,特殊字符

.shell变量用户定义变量,环境变量,位置变量(shell参数)

.shellscript编程

条件测试,循环及重复控制

.shell定制

1.shell基础知识

作者:

StephenBourne在Bell实验室开发

建议:

mansh查看相关UNIX上的改进或特性

(1)shell提示符及其环境

/etc/passwd文件

提示符:

$

/etc/profile$HOME/.profile

(2)shell执行选项

-n测试shellscript语法结构,只读取shellscript但不执行

-x进入跟踪方式,显示所执行的每一条命令,用于调度

-aTagallvariablesforexport

-c"string"从strings中读取命令

-e非交互方式

-f关闭shell文件名产生功能

-hlocateandrememberfunctionsasdefind

-i交互方式

-k从环境变量中读取命令的参数

-r限制方式

-s从标准输入读取命令

-t执行命令后退出(shellexits)

-u在替换中如使用未定义变量为错误

-vverbose,显示shell输入行

这些选项可以联合使用,但有些显然相互冲突,如-e和-i.

(3)受限制shell(RestirctedShell)

sh-r或/bin/rsh

不能执行如下操作:

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

test:

PS1="\$";exportPS1

$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:

/usr/local/bin:

/bin:

/usr/bin:

/usr/X11R6/bin:

/home/hbwork/bin

其他:

$dir=ls

$$dir

$aliasdirls

$dir

ls>filelist

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

$echo$Z

$

有条件的命令替换

在BourneShell中可以使变量替换在特定条件下执行,即有条件的环境变量替换。

这种变量替换总是用大括号括起来的。

.设置变量的默认值

在变量未赋值之前其值为空。

BourneShell允许对变量设置默认值,其格式如下:

${variable:

-defaultvalue}

例:

$echoHello$UNAME

Hello

$echoHello${UNAME:

-there}

Hellothere

$echo$UNAME#变量值并未发生变化

$UNAME=hbwork

$echoHello${UNAME:

-there}

Hellohbwork

$

.另一种情况:

改变变量的值,格式如下:

${variable:

=value}

例:

$echoHello$UNAME

Hello

$echoHello${UNAME:

=there}

Hellothere

$echo$UNAME#变量值并未发生变化

there

$

.变量替换中使用命令替换

$USERDIR=${$MYDIR:

-`pwd`}

.在变量已赋值时进行替换${variable:

+value}

.带有错误检查的有条件变量替换

${variable:

?

value}

例:

$UNAME=

$echo${UNAME:

?

"UNAMEhasnotbeenset"}

UNAME:

UNAMEhasnotbeenset

$echo${UNAME:

?

}

UNAME:

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$sh

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>/dev/rmt/0h

^D

执行:

$shbackup.sh

或:

$chmod+xbackup.sh

$./backup.sh

技巧:

在shellscript中加入必要的注释,以便以后阅读及维护。

(2)shell是一个(编程)语言

同传统的编程语言一样,shell提供了很多特性,这些特性可以使你的shellscript

编程更为有用,如:

数据变量、参数传递、判断、流程控制、数据输入和输出,子

程序及以中断处理等。

.在shell编程中使用数据变量可以将程序变量更为通用,如在上面backup.sh中:

cd$WORKDIR

ls*|cpio-o>/dev/rmt/0h

.Shell编程中的注释以#开头

.对shell变量进行数字运算,使用expr命令

exprintegeroperatorinteger

其中operator为+-*/%,但对*的使用要用转义符\,如:

$expr4\*5

20

$int=`expr5+7`

$echo$int

12

(3)Shell编程的参数传递,可通过命令行参数以及交互式输入变量(read)

restoreall.sh对backup.sh程序的备份磁带进行恢复

$cat>restoreall.sh

cd$WORKDIR

cpio-i

^D

restore1.sh:

只能恢复一个文件

#restore1--programtorestoreasinglefile

cd$WORKDIR

cpio-i$i

$restore1file1

恢复多个文件restoreany:

#restoreany--programtorestoreasinglefile

cd$WORKDIR

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>/dev/rmt/0h

rm-rf*

改进如下:

#当使用了管道命令时,管理命令的返回代码为最后一个命令的返回代码

ifls-a|cpio-o>/dev/rmt/0h

then

rm-rf*

fi

.if-then-else语句

ifcommand_1

then

command_2

else

command_3

fi

技巧:

由于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"

$test$str1=abcd

$echo$?

1

Note:

在test处理含有空格的变量时最好用引号将变量括起来,否则会出现错误的结果,

因为shell在处理命令行时将会去掉多余的空格,而用引号括起来则可以防止

shell去掉这些空格.

例:

$str1=""

$test$str1

$echo$?

1

$test"$str1"

$echo$?

0

$test-n$str1

test:

argumentexpected

$test-n"$str1"

$echo$?

0

$

b.整数测试:

test与expr相同,可以将字符型变量转换为整数进行操作,expr进行

整数的算术运算,而test则进行逻辑运算.

表达式说明

---------------------------------------

int1-eqint2相等?

int1-neint2不等?

int1-gtint2int1>int2?

int1-geint2int1>=int2?

int1-ltint2int1

int1-leint2int1<=int2?

例:

$int1=1234

$int2=01234

$test$int1-eq$int2

$echo$?

0

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

$echo$?

0

$test-sempty

1

$test!

-sempty

$echo$?

0

e.测试条件之逻辑运算

-aAnd

-oOr

例:

$test-rempty-a-sempty

$echo$?

1

f.进行test测试的标准方法

因为test命令在shell编程中占有很重要的地位,为了使shell能同其他编程语言一样

便于阅读和组织,BourneShell在使用test测试时使用了另一种方法:

用方括号将整个

test测试括起来:

$int1=4

$[$int1-gt2]

$echo$?

0

例:

重写unload程序,使用test测试

#!

/bin/sh

#unload-programtobackupandremovefiles

#syntax:

unloaddirectory

#checkarguments

if[$#-ne1]

then

echo"usage:

$0directory"

exit1

fi

#checkforvaliddirectoryname

if[!

-d"$1"]

then

echo"$1isnotadirectory"

exit2

fi

cd$1

ls-a|cpio-o>/dev/rmt/0h

if[$?

-eq0]

then

rm-rf*

else

echo"Aproblemhasoccuredincreatingbackup"

echo"Thedirectorywillnotbeereased"

echo"Pleasecheckthebackupdevice"

exit3

fi

#endofunload

在如上示例中出现了exit,exit有两个作用:

一是停止程序中其他命令的执行,二是

设置程序的退出状态

g.if嵌套及elif结构

ifcommand

then

command

else

ifcommand

then

command

else

ifcommand

then

command

fi

fi

fi

改进:

使用elif结构

ifcommand

then

command

elifcommand

then

command

elifcommand

then

command

fi

elif结构同if结构类似,但结构更清淅,其执行结果完全相同.

BourneShell及shell编程

(2)

作者:

何斌武(hbwork@,大连理工大学网络中心,April1999.)

  

BourneShell及Shell编程

(2)

h.交互式从键盘读入数据

使用read语句,其格式如下:

readvar1var2...varn

read将不作变量替换,但会删除多余的空格,直到遇到第一个换行符(回车),

并将输入值依次赋值给相应的变量。

例:

$readvar1var2var3

Hellomyfriends

$echo$var1$var2$var3

Hellomyfriends

$echo$var1

Hello

$readvar1var2var3

Hellomydearfriends

$echo$var3

dearfriends<-输入多余变量时,输入值余下的内容赋给最后一个变量

$readvar1var2var3

Hellofriends

$echo$var3

<-var3为空

$

在shellscript中可使用read语句进行交互操作:

...

#echo-nmessage输出结果后不换行

echo-n"Doyouwanttocontinue:

YorN"

readANSWER

if[$ANSWER=N-o$ANSWER=n]

then

exit

fi

i.case结构:

结构较elif-then结构更清楚

比较if-then语句:

if[variable1=value1]

then

command

command

elif[variable1=value2]

then

command

command

elif[variable1=value3]

then

command

command

fi

相应的case结构:

casevaluein

pattern1)

command

command;;

pattern2)

command

command;;

...

patternn)

command;

esac

*case语句只执行第一个匹

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1