您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > Korn-shell和高级shell编程
1591532837118Confidentialitylevel密级Allrightsreserved版权所有,侵权必究Page1,Total11第1页,共11页HuaweiTechnologiesCo.Ltd.华为技术有限公司Confidentialitylevel密级Total11pages共11页Kornshell和高级shell编程Preparedby拟制陈刚Date日期2004-03-23Reviewedby评审人Date日期yyyy-mm-ddApprovedby批准Date日期yyyy-mm-ddAuthorizedby签发Date日期yyyy-mm-ddHuaweiTechnologiesCo.,Ltd.华为技术有限公司Allrightsreserved版权所有侵权必究1591532837118Confidentialitylevel密级Allrightsreserved版权所有,侵权必究Page2,Total11第2页,共11页Kornshell和高级shell编程1.Kornshell基础1.启动文件Kornshell的启动文件/etc/profile和.profile(在用户的宿主目录中)中保存这用户的环境变量.2.符号命令内置命令用法()子shell$()命令替换(())赋值运算符(当被包围的值中包含一个等号时才使用)$(())表达式求值(不与被包围的等号一起使用)[]test命令[[]]与[]类似,但是加入了字符串比较功能3.变量变量赋值VARIABLE=value可以使用内置命令unsed(sh,csh,ksh)来取消一个或多个变量的设置:unsetPREFSUFF注:使用命令manshell_builtins可以看到ksh(和其他)内置命令的列表.使用命令manksh可以查看整个ksh的帮助文档.4.变量的属性内置命令typeset(ksh)就是用来设置变量属性的.-u将变量值中所有字母全部转换为大写字母.例如:$typeset–uNAME$NAME=”BarbaraJackson”$echo$NAMEBARBARAJACKSON-i具有整形属性的变量.integer内置命令(ksh)与typeset–i几乎相同.1591532837118Confidentialitylevel密级Allrightsreserved版权所有,侵权必究Page3,Total11第3页,共11页语法:typeset–ibasevariable其中,base表示进制的基数,如果基数不是10,变量的值就表示成base#value例如:$COUNT=20$typeset–i2BCOUNT$BCOUNT=$COUNT$echo$COUNT$BCOUNT202#10100-x具有export属性,这个属性与内置命令export(sh,ksh)相似,如果一个变量具有这个属性,那么此变量的副本就可以被所有的子进程继承.Kornshell支持内置命令export,也提供typeset–x来设置export的属性.用户可以象给变量设置属性一样给函数社子export属性,具有export属性的函数在所有的子shell中都是可用的.格式化属性:选项作用-Lwidth在width宽度之内左对齐-Rwidth在width宽度之内右对齐-Zwidth在width宽度之内右对齐,变量如果是数字,则前面用0填充.注:如果用户忽略了width,那么ksh将是使用赋给这个变量的第一个值的宽度.例如:$typeset–L8FRUIT1FRUIT2$FRUIT1=apple$FRUIT2=watermelon$echo$FRUIT1$FRUIT2applewatermel$echo$FRUIT2$FRUIT1watermelapple$typeset–Z2DAY$DAY=2;echo$DAY02$typeset–LMONTH$MONTH=11;echo$MONTH/$DAY/9711/02/97$MONTH=8;echo$MONTH/$DAY/978/02/97-rreadonly属性,具有readonly属性的变量的值不能被改变.用户在给变量设置readonly属性的同事或者设置readonly之前,要先给这些变量赋值.例如:$PATH=/usr/ucb:/usr/bin:/usr/local/bin:/usr/games1591532837118Confidentialitylevel密级Allrightsreserved版权所有,侵权必究Page4,Total11第4页,共11页$typeset–rPATHFPATHusrlocalfuncs$PATH=/usr/bin:/usr/ucb:/usr/local/bin:/usr/gamesksh:PATH:isreadonly注:用户可以使用内置命令readonly(sh,ksh)来代替typeset–r.$readonlyPATHFPATH=/usr/local/funcs不带有任何参数的typeset可以列出变量和变量的属性.例如:$typeset|grepDAYzerofill2rightjust2DAY使用带有某个选项的typeset来看哪一个变量具有某一个特定的属性:$typeset-ZDAY=025.局部变量内置命令typeset的用法之一就是为函数声明一个局部变量.typesetvarname6.关键字变量当用户启动一个会话时,Kornshell自动定义并继承一些变量.这些变量包括来自sh和ksh中的大部分shell关键字变量.变量作用#(sh,ksh)命令行参数的数目*(sh,ksh)所有命令行参数作为一个参数@(sh,ksh)所有的命令行参数,每个都作为独立的参数_(下划线(ksh))在shell当前的情况下,前面简单命令中的最后一个参数.$catfile1file2file3all3files#echo$_file3CDPATH(sh,ksh)搜寻路径的绝对路径名列表FCEDIT(ksh)内置命令fc使用的编辑器的名称FPATH或fpath(ksh)包含shell函数的文件列表HISTFILE(ksh)保存用户历列表的文件名HISTFILESIZE(ksh)保存用户HISTFILE中的历史列表的行数HOME(sh,ksh)用户主目录的路径名IFS(sh,ksh)内部字段的分隔符LINENO(ksh)在ksh执行脚本或函数的命令之前,先把ksh将要执行的命令的函数赋值给LINENO.MAIL(sh,ksh)保存用户邮件的文件OPTARG和OPTIND(sh,ksh)这些变量由内置命令getopts设置1591532837118Confidentialitylevel密级Allrightsreserved版权所有,侵权必究Page5,Total11第5页,共11页PATH(sh,csh,ksh)shell查找命令的目录列表PPID(ksh)父进程中PID的值PS1(sh,ksh)shell的提示字符串PS2(sh,ksh)shell的辅助提示字符串LINES和COLUMNS及PS3(ksh)控制哪些使用select命令的shell脚本所产生的输出格式.PS4(ksh)在调试模式下使用的提示字符串.PS4的缺省值是+.OLDPWD和PWDshell在PWD(sh,csh,ksh)中保存了最近一次由cd命令设置的当前工作目录的绝对路径名.而在OLDPWD(ksh)中保存了前一个工作目录的路径名.RANDOM(ksh)每次使用此变量,都会给这个变量赋值一个0~32767之间的随即整型值.SECONDS(ksh)从这个shell会话启动时计算所过去的的时间秒数.TMOUT如果设置了该变量,则在没有输入的情况下经过TMOUT变量所执行的秒数之后,shell退出.这个变量经常在一个全局的启动文件中设置为只读.7.扩展shell变量(1)字符串模式匹配这些运算符可以从字符串中删除具备匹配模式的前缀或后缀.字符串运算符含义#删除最小的匹配前缀##删除最大的匹配前缀%删除最小的匹配后缀%%删除最大的匹配后缀这些运算符的语法为:${arnameoppattern}在上面的语法中,op时表格中所列出的运算符之一,而pattern是与用于生成文件名的匹配模式相类似的匹配模式.例如:$SOURCEFILE=/usr/local/src/prog.c$echo${SOURCEFILE#/*/}local/src/prog.c$echo${SOURCEFILE##/*/}prog.c$echo${SOURCEFILE%/*}/usr/local/src$echo${SOURCEFILE%%/*}$echo${SOURCEFILE%.c}/usr/local/src/prog$CHOPFIRST=${SOURCEFILE#/*/}1591532837118Confidentialitylevel密级Allrightsreserved版权所有,侵权必究Page6,Total11第6页,共11页$echo$CHOPFIRSTlocal/src/prog.c$NEXT=${CHOPFIRST%%/*}$echo$NEXTlocal8.数组变量Kornshell支持一维数组变量.下标是以0开始的整数.用户可以使用内置命令set将一个数组的值赋给一个变量,如下所示:set–Anameelementelement2...例如:$set–ANAMEalexhelenjennyscott$echo$NAMEalex$echo${NAME[2]}jenny用户可以使用一个星号来显示数组的所有元素:$echo${NAME[*]}alexhelenjennyscott另外,还有一些特殊的,非整数的下标.下标[*]和[@]都是用来提取整个数组的内容的,但是当它们在引号中使用时其行为是不同的.使用@可生成一个数组,这个数组是原始数组的副本;而使用*,则生成的仅仅是具有单一元素的数组(或者是一个普通变量),这个元素是由使用IFS的第一个字符(通常是一个空格)分隔开的原始数组的所有元素构成.例如:$set–AA“${NAME[*]}”$set–AB“${NAME[@]}”$set|head-5A='alexhelenjennyscott'B[0]=alexB[1]=helenB[2]=jennyB[3]=scott用户可以在赋值语句的左侧使用下标来替换数组中指定的元素的值$NAME[4]=william$echo${NAME[*]}alexhelenjennyscottwilliam9.算术1591532837118Confidentialitylevel密级Allrightsreserved版权所有,侵权必究Page7,Total11第7页,共11页(1)赋值使用ksh内置命令let赋值例如:$let“VALUE=VALUE*10+NEW”在这个例子中,变量VALUE和NEW应该是整数值.在let语句中,美元符号($)不需要加载变量名之前.双引号把参数括起来以避免shell将星号当作文件模式匹配运算符—--含有空格的参数也必须用引号括起来.Kornshell接受((expression))作为let“expression”的同义词,以避免引号的转义.例如:$((VALUE=VALUE*10+NEW))let的每一个参数都作为一个独立的表达式来进行赋值,所以可以在一行中同时给不只一个变量赋值:$letCOUNT=COUNT+1“VALUE=VALUE*10+NEW”(2)表达式可以象使用命令参数一样使用算术表达式,将其包围在$((和))中代替任意的数字值.$echo“Thereare$((60*60*24*365))secondsinanon-leapyear.”Thereare31536000secondsinanon-leapyear.不需要将$((expression))包含在引号中,因为Kornshell在$((和)
本文标题:Korn-shell和高级shell编程
链接地址:https://www.777doc.com/doc-5741940 .html