Korn-shell和高级shell编程_第1页
Korn-shell和高级shell编程_第2页
Korn-shell和高级shell编程_第3页
Korn-shell和高级shell编程_第4页
Korn-shell和高级shell编程_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Huawei Technologies Co. Ltd.华为技术有限公司Confidentiality level密级Total 11 pages共11页Korn shell和高级shell编程Prepared by 拟制陈刚Date日期2004-03-23Reviewed by 评审人Date日期yyyy-mm-ddApproved by批准Date日期yyyy-mm-ddAuthorized by签发Date日期yyyy-mm-ddHuawei Technologies Co., Ltd. 华为技术有限公司All rights reserved版权所有 侵权必究Korn shell和高级s

2、hell编程1. Korn shell基础1. 启动文件Korn shell的启动文件/etc/profile和.profile(在用户的宿主目录中)中保存这用户的环境变量.2. 符号命令内置命令用法()子shell$()命令替换()赋值运算符(当被包围的值中包含一个等号时才使用)$()表达式求值(不与被包围的等号一起使用)test 命令与类似,但是加入了字符串比较功能3. 变量变量赋值VARIABLE=value可以使用内置命令unsed(sh,csh,ksh)来取消一个或多个变量的设置:unset PREF SUFF注: 使用命令 man shell_builtins可以看到ksh(和其他

3、)内置命令的列表.使用命令 man ksh可以查看整个ksh的帮助文档.4. 变量的属性内置命令typeset(ksh)就是用来设置变量属性的.-u 将变量值中所有字母全部转换为大写字母.例如:$ typeset u NAME$ NAME=”Barbara Jackson”$ echo $NAMEBARBARA JACKSON-i 具有整形属性的变量.integer内置命令(ksh)与typeset i几乎相同.语法: typeset ibase variable其中,base表示进制的基数,如果基数不是10,变量的值就表示成base#value例如:$ COUNT=20$ typeset i

4、2 BCOUNT$ BCOUNT=$COUNT$ echo $COUNT $BCOUNT20 2#10100-x 具有export属性,这个属性与内置命令export(sh,ksh)相似,如果一个变量具有这个属性,那么此变量的副本就可以被所有的子进程继承.Korn shell支持内置命令export,也提供typeset x来设置export的属性.用户可以象给变量设置属性一样给函数社子export属性,具有export属性的函数在所有的子shell中都是可用的.格式化属性:选项作用-Lwidth在width宽度之内左对齐-Rwidth在width宽度之内右对齐-Zwidth在width宽度之

5、内右对齐,变量如果是数字,则前面用0填充.注:如果用户忽略了width,那么ksh将是使用赋给这个变量的第一个值的宽度.例如:$ typeset L8FRUIT1 FRUIT2$ FRUIT1=apple$ FRUIT2=watermelon$ echo $FRUIT1$FRUIT2apple watermel$ echo $FRUIT2$FRUIT1watermelapple$ typeset Z2 DAY$ DAY=2; echo $DAY02$ typeset L MONTH$ MONTH=11; echo $MONTH/$DAY/9711/02/97$ MONTH=8; echo $M

6、ONTH/$DAY/978 /02/97-r readonly属性,具有readonly属性的变量的值不能被改变.用户在给变量设置readonly属性的同事或者设置readonly之前,要先给这些变量赋值.例如:$ PATH=/usr/ucb:/usr/bin:/usr/local/bin:/usr/games$ typeset r PATH FPATHusrlocalfuncs$ PATH=/usr/bin:/usr/ucb:/usr/local/bin:/usr/gamesksh: PATH: is read only注: 用户可以使用内置命令 readonly (sh,ksh)来代替ty

7、peset r.$ readonly PATH FPATH=/usr/local/funcs不带有任何参数的typeset可以列出变量和变量的属性.例如:$ typeset | grep DAYzerofill 2 rightjust 2 DAY使用带有某个选项的typeset来看哪一个变量具有某一个特定的属性:$ typeset -ZDAY=025. 局部变量内置命令typeset的用法之一就是为函数声明一个局部变量.typeset varname6. 关键字变量当用户启动一个会话时,Korn shell自动定义并继承一些变量.这些变量包括来自sh和ksh中的大部分shell关键字变量.变量

8、作用# (sh,ksh)命令行参数的数目* (sh,ksh)所有命令行参数作为一个参数 (sh,ksh)所有的命令行参数,每个都作为独立的参数_ (下划线(ksh)在shell当前的情况下,前面简单命令中的最后一个参数.$ cat file1 file2 file3 all3files# echo $_file3CDPATH (sh,ksh)搜寻路径的绝对路径名列表FCEDIT (ksh)内置命令fc使用的编辑器的名称FPATH或fpath (ksh)包含shell函数的文件列表HISTFILE (ksh)保存用户历列表的文件名HISTFILESIZE (ksh)保存用户HISTFILE中的历

9、史列表的行数HOME (sh, ksh)用户主目录的路径名IFS (sh,ksh)内部字段的分隔符LINENO (ksh)在ksh执行脚本或函数的命令之前,先把ksh将要执行的命令的函数赋值给LINENO.MAIL (sh,ksh)保存用户邮件的文件OPTARG和OPTIND (sh,ksh)这些变量由内置命令getopts设置PATH (sh,csh,ksh)shell查找命令的目录列表PPID (ksh)父进程中PID的值PS1 (sh,ksh)shell的提示字符串PS2 (sh,ksh)shell的辅助提示字符串LINES和COLUMNS及PS3 (ksh)控制哪些使用select命令

10、的shell脚本所产生的输出格式.PS4 (ksh)在调试模式下使用的提示字符串.PS4的缺省值是+.OLDPWD和PWDshell在PWD (sh,csh,ksh)中保存了最近一次由cd命令设置的当前工作目录的绝对路径名.而在OLDPWD (ksh)中保存了前一个工作目录的路径名.RANDOM (ksh)每次使用此变量,都会给这个变量赋值一个032767之间的随即整型值.SECONDS (ksh)从这个shell会话启动时计算所过去的的时间秒数.TMOUT如果设置了该变量,则在没有输入的情况下经过TMOUT变量所执行的秒数之后,shell退出.这个变量经常在一个全局的启动文件中设置为只读.7

11、. 扩展shell变量(1) 字符串模式匹配这些运算符可以从字符串中删除具备匹配模式的前缀或后缀.字符串运算符含义#删除最小的匹配前缀#删除最大的匹配前缀%删除最小的匹配后缀%删除最大的匹配后缀这些运算符的语法为:$arname op pattern在上面的语法中,op时表格中所列出的运算符之一,而pattern是与用于生成文件名的匹配模式相类似的匹配模式.例如:$ SOURCEFILE=/usr/local/src/prog.c$ echo $SOURCEFILE#/*/local/src/prog.c$ echo $SOURCEFILE#/*/prog.c$ echo $SOURCEFIL

12、E%/*/usr/local/src$ echo $SOURCEFILE%/*$ echo $SOURCEFILE%.c/usr/local/src/prog$ CHOPFIRST=$SOURCEFILE#/*/$ echo $CHOPFIRSTlocal/src/prog.c$ NEXT=$CHOPFIRST%/*$ echo $NEXTlocal8. 数组变量Korn shell支持一维数组变量.下标是以0开始的整数.用户可以使用内置命令set将一个数组的值赋给一个变量,如下所示:set A name element element2 .例如:$ set A NAME alex helen

13、 jenny scott$ echo $NAMEalex$ echo $NAME2jenny用户可以使用一个星号来显示数组的所有元素:$ echo $NAME*alex helen jenny scott另外,还有一些特殊的, 非整数的下标.下标*和都是用来提取整个数组的内容的,但是当它们在引号中使用时其行为是不同的.使用可生成一个数组,这个数组是原始数组的副本;而使用*,则生成的仅仅是具有单一元素的数组(或者是一个普通变量),这个元素是由使用IFS的第一个字符(通常是一个空格)分隔开的原始数组的所有元素构成.例如:$ set A A “$NAME*”$ set A B “$NAME”$ se

14、t | head -5A=alex helen jenny scottB0=alexB1=helenB2=jennyB3=scott用户可以在赋值语句的左侧使用下标来替换数组中指定的元素的值$ NAME4=william$ echo $NAME*alex helen jenny scott william9. 算术(1) 赋值使用ksh内置命令let赋值例如:$ let “VALUE=VALUE*10+NEW”在这个例子中,变量VALUE和NEW应该是整数值.在let语句中,美元符号($)不需要加载变量名之前.双引号把参数括起来以避免shell将星号当作文件模式匹配运算符-含有空格的参数也必须

15、用引号括起来.Korn shell接受(expression)作为let “expression”的同义词,以避免引号的转义.例如:$ (VALUE=VALUE*10+NEW)let的每一个参数都作为一个独立的表达式来进行赋值,所以可以在一行中同时给不只一个变量赋值:$ let COUNT=COUNT+1 “VALUE=VALUE*10+NEW”(2) 表达式可以象使用命令参数一样使用算术表达式,将其包围在$(和)中代替任意的数字值.$ echo “There are $(60*60*24*365) seconds in a non-leap year.”There are seconds i

16、n a non-leap year.不需要将$(expression)包含在引号中,因为Korn shell在$(和)中不执行文件名扩展功能.这个特性使得很容易使用一个星号来完成乘法.注:$()双括号内部的独立变量前的美元符号是可选项.$ x=23$ y=37$ echo $(2*x+3*y)157$ echo $(2*$x+3*$y)157(3) 运算符下表是Korn shell中可以在算术表达式中使用的运算符.运算符含义+单目”加”-单目”减”!逻辑”非”求补&按位”与”按位”异或”|按位”或”*乘/除%求余+加-减右移大于=大于等于=等于!=不等于&逻辑 “与”|逻辑 “或”= += -

17、= *= /= %= = |= 赋值& 和 |被称为短路运算符(short circuiting).如果使用这两个运算符之一的结果可以通过左边的操作数决定的话,那么右边的操作数就可以不用考虑了.例如:$ (N=10)$ (Z=0)$ echo $( N | (Z+=1) )1$ echo $Z010. 内置命令控制过程流的Korn shell控制结构是ifthen , forin, while, case ,until, repeat和select.if , while及until控制结构与test-command(不是test内置命令(sh,ksh)用法相同.可以使用test内置命令, (两

18、个方括号)内置命令以及类似test-command的其它命令. 其中,内置命令的语法规则为: conditions 执行该内置命令的结果类似于test内置命令,是一个返回状态.括号内允许的conditions基本是一个test命令能接受的扩展集.test内置命令使用-a和-o选项,Korn shell将使用& 和|.可以随使用test的数字关系运算符-gt,-ge,-lt,-le,-eq和-ne.Korn shell允许使用算术表达式,而不仅仅局限于常数作为操作数.例如:$ $( $#HOME + 14 ) lt $#PWD $ echo $?1注:Korn shell也允许算术测试,给测试出

19、现在双圆括号()中,而不是方括号,双圆括号前不使用美元$符号,同事测试的结果不是数字值,返回值只是true或者false.例如:if $( $#HOME + 14 ) lt $#PWD then 或者if ( $( $#HOME + 14 ) $#PWD )then或者if ( $#HOME + 14 $#PWD )then以上最后一个版本使用类似算术运算符的比较运算符,使用起来比较自然.11. 输入与输出(1) 使用read命令接受输入语法规则:read -prs -un varname?prompt varname注:变量名为可选项.例如:$ read MON?”Enter month,d

20、ay and year separated by spaces:” DAY YREnter month,day and year separated by spaces:如果用户输入三个值,它们被赋值给MON,DAY,和YR,问号(?)用户避免Korn shell将它作为文件名模式匹配运算符.read 命令的其它选项:选项作用-pcoprocess命令read p 将从协同进程(coprocess)的标准输出中读入输入行-rraw input 通常如果输入行以一个反斜杠()结束,则反斜杠()与其紧随其后的NEWLINE将被省略.该选项将导致结尾的反斜杠作为一个普通的字符.该选项的一种应用是用于

21、读取某个输入文件,该输入文件本身作为一个包含用户所希望复制的反斜杠的shell脚本.-ssave 将输入作为命令行存入history文件中-un使用整数n作为文件描述符,read从该文件读入数据read u4 arg1 arg2等效于read arg1 arg2 &4如果read内置命令成功读取任何数据,则它的退出状态值为0,当它读到EOF(文件结束)时,它将具有非零退出状态值.例如:$ exec 3 name$ read u3 line1; print $line1; read u3 line2; print $line2Alice jonesRebort smith$ exec 3或者1重定向标准输出,使用符号2重定向标准错误.使用exec内置命令打开文件:$ exec 3 outfile$ exec 4 infile记号&同时复制输入文件和输出文件的文件描述符.用户可以通过以文件描述符指同一个文件作为其它的打开文件描述符来复制一个文件描述符.例如,标准输入和标准输出下面的命令打开或者重定向文件描述府n作为文件描述符m的一个副本:exec n&n将标准输出重定向到一个文件描述符,或者用&n将标准输入重定向到一个文件描述符.通过下面的命令关闭这个文件

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论