Korn shell和高级shell编程.docx

上传人:b****5 文档编号:8270474 上传时间:2023-01-30 格式:DOCX 页数:15 大小:31.38KB
下载 相关 举报
Korn shell和高级shell编程.docx_第1页
第1页 / 共15页
Korn shell和高级shell编程.docx_第2页
第2页 / 共15页
Korn shell和高级shell编程.docx_第3页
第3页 / 共15页
Korn shell和高级shell编程.docx_第4页
第4页 / 共15页
Korn shell和高级shell编程.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

Korn shell和高级shell编程.docx

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

Korn shell和高级shell编程.docx

Kornshell和高级shell编程

HuaweiTechnologiesCo.Ltd.

华为技术有限公司

Confidentialitylevel

密级

Total11pages共11页

Kornshell和高级shell编程

Preparedby

拟制

陈刚

Date

日期

2004-03-23

Reviewedby

评审人

Date

日期

yyyy-mm-dd

Approvedby

批准

Date

日期

yyyy-mm-dd

Authorizedby

签发

Date

日期

yyyy-mm-dd

HuaweiTechnologiesCo.,Ltd.

华为技术有限公司

Allrightsreserved

版权所有XX

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

BARBARAJACKSON

-i具有整形属性的变量.integer内置命令(ksh)与typeset–i几乎相同.

语法:

typeset–ibasevariable

其中,base表示进制的基数,如果基数不是10,变量的值就表示成base#value

例如:

$COUNT=20

$typeset–i2BCOUNT

$BCOUNT=$COUNT

$echo$COUNT$BCOUNT

202#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$FRUIT2

applewatermel

$echo$FRUIT2$FRUIT1

watermelapple

$typeset–Z2DAY

$DAY=2;echo$DAY

02

$typeset–LMONTH

$MONTH=11;echo$MONTH/$DAY/97

11/02/97

$MONTH=8;echo$MONTH/$DAY/97

8/02/97

-rreadonly属性,具有readonly属性的变量的值不能被改变.用户在给变量设置readonly属性的同事或者设置readonly之前,要先给这些变量赋值.

例如:

$PATH=/usr/ucb:

/usr/bin:

/usr/local/bin:

/usr/games

$typeset–rPATHFPATHusrlocalfuncs

$PATH=/usr/bin:

/usr/ucb:

/usr/local/bin:

/usr/games

ksh:

PATH:

isreadonly

注:

用户可以使用内置命令readonly(sh,ksh)来代替typeset–r.

$readonlyPATHFPATH=/usr/local/funcs

不带有任何参数的typeset可以列出变量和变量的属性.

例如:

$typeset|grepDAY

zerofill2rightjust2DAY

使用带有某个选项的typeset来看哪一个变量具有某一个特定的属性:

$typeset-Z

DAY=02

5.局部变量

内置命令typeset的用法之一就是为函数声明一个局部变量.

typesetvarname

6.关键字变量

当用户启动一个会话时,Kornshell自动定义并继承一些变量.这些变量包括来自sh和ksh中的大部分shell关键字变量.

变量

作用

#(sh,ksh)

命令行参数的数目

*(sh,ksh)

所有命令行参数作为一个参数

@(sh,ksh)

所有的命令行参数,每个都作为独立的参数

_(下划线(ksh))

在shell当前的情况下,前面简单命令中的最后一个参数.

$catfile1file2file3>all3files

#echo$_

file3

CDPATH(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设置

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和PWD

shell在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#/*/}

$echo$CHOPFIRST

local/src/prog.c

$NEXT=${CHOPFIRST%%/*}

$echo$NEXT

local

8.数组变量

Kornshell支持一维数组变量.下标是以0开始的整数.用户可以使用内置命令set将一个数组的值赋给一个变量,如下所示:

set–Anameelementelement2...

例如:

$set–ANAMEalexhelenjennyscott

$echo$NAME

alex

$echo${NAME[2]}

jenny

用户可以使用一个星号来显示数组的所有元素:

$echo${NAME[*]}

alexhelenjennyscott

另外,还有一些特殊的,非整数的下标.下标[*]和[@]都是用来提取整个数组的内容的,但是当它们在引号中使用时其行为是不同的.使用@可生成一个数组,这个数组是原始数组的副本;而使用*,则生成的仅仅是具有单一元素的数组(或者是一个普通变量),这个元素是由使用IFS的第一个字符(通常是一个空格)分隔开的原始数组的所有元素构成.

例如:

$set–AA“${NAME[*]}”

$set–AB“${NAME[@]}”

$set|head-5

A='alexhelenjennyscott'

B[0]=alex

B[1]=helen

B[2]=jenny

B[3]=scott

用户可以在赋值语句的左侧使用下标来替换数组中指定的元素的值

$NAME[4]=william

$echo${NAME[*]}

alexhelenjennyscottwilliam

 

9.算术

(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在$((和))中不执行文件名扩展功能.这个特性使得很容易使用一个星号来完成乘法.

注:

$(())双括号内部的独立变量前的美元符号是可选项.

$x=23

$y=37

$echo$((2*x+3*y))

157

$echo$((2*$x+3*$y))

157

(3)运算符

下表是Kornshell中可以在算术表达式中使用的运算符.

运算符

含义

+

单目”加”

-

单目”减”

!

逻辑”非”

~

求补

&

按位”与”

^

按位”异或”

|

按位”或”

*

/

%

求余

+

-

<<

左移

>>

右移

<

小于

>

大于

<=

小于等于

>=

大于等于

==

等于

!

=

不等于

&&

逻辑“与”

||

逻辑“或”

=+=-=*=/=%=^=|=

赋值

&&和||被称为短路运算符(shortcircuiting).如果使用这两个运算符之一的结果可以通过左边的操作数决定的话,那么右边的操作数就可以不用考虑了.

例如:

$((N=10))

$((Z=0))

$echo$((N||((Z+=1))))

1

$echo$Z

0

10.内置命令

控制过程流的Kornshell控制结构是if…then,for…in,while,case,until,repeat和select.

if,while及until控制结构与test-command(不是test内置命令(sh,ksh))用法相同.可以使用test内置命令,[[(两个方括号)内置命令以及类似test-command的其它命令.其中,[[内置命令的语法规则为:

[[conditions]]

执行该内置命令的结果类似于test内置命令,是一个返回状态.括号内允许的conditions基本是一个test命令能接受的扩展集.test内置命令使用-a和-o选项,Kornshell将使用&&和||.

可以随[[使用test的数字关系运算符-gt,-ge,-lt,-le,-eq和-ne.Kornshell允许使用算术表达式,而不仅仅局限于常数作为操作数.

例如:

$[[$((${#HOME}+14))–lt${#PWD}]]

$echo$?

1

注:

Kornshell也允许算术测试,给测试出现在双圆括号(())中,而不是方括号,双圆括号前不使用美元$符号,同事测试的结果不是数字值,返回值只是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…]

注:

变量名为可选项.

例如:

$readMON\?

”Entermonth,dayandyearseparatedbyspaces:

”DAYYR

Entermonth,dayandyearseparatedbyspaces:

如果用户输入三个值,它们被赋值给MON,DAY,和YR,问号(?

)用户避免Kornshell将它作为文件名模式匹配运算符.

read命令的其它选项:

选项

作用

-p

coprocess命令

read–p…

将从协同进程(coprocess)的标准输出中读入输入行

-r

rawinput通常如果输入行以一个反斜杠(\)结束,则反斜杠(\)与其紧随其后的NEWLINE将被省略.该选项将导致结尾的反斜杠作为一个普通的字符.该选项的一种应用是用于读取某个输入文件,该输入文件本身作为一个包含用户所希望复制的反斜杠的shell脚本.

-s

save将输入作为命令行存入history文件中

-un

使用整数n作为文件描述符,read从该文件读入数据

read–u4arg1arg2

等效于

readarg1arg2<&4

如果read内置命令成功读取任何数据,则它的退出状态值为0,当它读到EOF(文件结束)时,它将具有非零退出状态值.

例如:

$exec3

$read–u3line1;print$line1;read–u3line2;print$line2

Alicejones

Rebortsmith

$exec3<&-

(2)使用print显示输出

print内置命令(ksh)的语法规则如下:

print[-nRrps][-un][string…]

在缺省情况下,print将字符串写入标准输出,同时可以接受忽略尾随NEWLINE的两种语法(字符串尾部的标志符\c和-n选项).

下表是转义字符表:

转义符

含义

\a

警告字符(通常是使显示产生蜂鸣声或者闪烁)

\b

退格字符

\c

不打印,同时忽略尾随NEWLINE

\e

ESCAPE字符

\f

换页—---在输出流中加入CONTROL-L字符

\n

NEWLINE—---允许用单个print调用输出多行

\r

RETURN----在输出流中加入CONTROL-M字符

\t

TAB字符

\v

纵向制表符

\\

放斜杠字符

\0nnn

ASCII字符,其八进制值为nnn,例如print"\0101",将输出A,注意反斜杠后是零而不是字符o

\xnnn

ASCII字符,其十六进制值为nnn

12.文件描述符

使用符号>或者1>重定向标准输出,使用符号2>重定向标准错误.

使用exec内置命令打开文件:

$exec3>outfile

$exec4

记号<&同时复制输入文件和输出文件的文件描述符.用户可以通过以文件描述符指同一个文件作为其它的打开文件描述符来复制一个文件描述符.例如,标准输入和标准输出下面的命令打开或者重定向文件描述府n作为文件描述符m的一个副本:

execn<&m

用户一旦打开文件,则可以使用两种不同的方式将它用于输入和输出.使用>&n将标准输出重定向到一个文件描述符,或者用<&n将标准输入重定向到一个文件描述符.

通过下面的命令关闭这个文件:

execn<&-

13.函数

function内置命令(ksh)列出所有定义的函数.

unfunction内置命令(ksh)可删除对一个函数的定义.

可以将函数存储于文件中,当函数第一次调用时则加载到内存.命令autoload内置命令(ksh)可提示ksh某个函数保存在一个文件中.当执行函数autoload(通常在用户开始一个新的shell时),shell不会将函数加载到内存----它只是跟踪函数的民称(实际上它将函数看作一个未定义的函数).当一个脚本第一次调用一个autoload函数,ksh根据列表于FPATH中的路径搜索与函数名相同的文件.当它找到指定文件,它将这个文件加载到内存,同时将这个文件在内存中驻留.

函数autoload的语法规则是:

autoloadfunc_name

需要确保函数定义名与文件存储名为相同的民称.通常用户需要有一个包含许多小文件的目录,其中每个文件包含一个单一函数的定义.如果用户在使用不同shell函数的多个工程减的工作,则用户必须有一些这样的路径.

14.命令处理

Kornshell执行以下的基本步骤,按照下表中的顺序来处理一条命令:

命令顺序

含义

记号分隔

即将输入字符流分隔为单词,并识别I/O重定向运算符

别名替换

识别别名和扩展别名

文件名扩展

用它们的扩展值替换以~开头的单词

参数扩展

扩展所有未被引号括起来的变量表达式

命令替换

确定在符号(‘…’)或命令替换符号($())中的命令,并且以命令的标准输出替换命令

算术扩展

用算术表达式结果值代替算术表达式

文件名生成

将包含文件匹配模式的路径名替换为路径名扩展列表

引号处理

从命令行中删除大多数引号

重定向

重定向标准输出/标准输入/标准错误和其它文件描述符

执行命令行

执行结果命令行

 

2.sed基础

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

当前位置:首页 > 农林牧渔 > 林学

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

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