linux的tcsh脚本编程.docx
《linux的tcsh脚本编程.docx》由会员分享,可在线阅读,更多相关《linux的tcsh脚本编程.docx(32页珍藏版)》请在冰豆网上搜索。
linux的tcsh脚本编程
TCSHshell编程入门
TCSHshell不同于其他的shell,因为控制结构更符合程序设计语言的格式。
例如TCSH的test条件的控制结构是表达式,而不是linux命令,得到的值是逻辑值true或false,TCSH的表达式与C语言中的表达式基本相同。
第一篇TCSHshell简介
TCSHshell不同于其他的shell,因为控制结构更符合程序设计语言的格式。
例如TCSH的test条件的控制结构是表达式,而不是linux命令,得到的值是逻辑值true或false,TCSH的表达式与C语言中的表达式基本相同。
一、TCSHshell变量、脚本和参数
用户可以在shell中定义变量,为变量赋值以及引用脚本参数。
TCSH使用set,@,setenv定义一变量,也可以用相同的方法定义数值变量和数组,用户通过@命令定义的数值变量来进行算术运算,用户使用圆括号()和方括号[]定义和引用数组。
脚本也可以用相同的方法操作,但是有个例外,尽管可以用echo命令输出提示符,但没有read命令处理输入,相反,必须重定向到一个变量里。
二、脚本输入和脚本输出:
$<
用户能够在脚本范围中定义和使用变量。
在下例中,使用文本编辑器把赋值操作和echo之类的linux命令放在一个文件中。
然后可以产生可执行文件并像其他命令一样在命令行中执行它,要记住添加可执行权限,必须使用带u+x参数的chmod命令或者带绝对参数700的chmod命令。
本中,可以使用echo命令去输出数据,但是,必须通过重定向标准输入把输入读入变量。
在TCSH中没有linuxread命令的比较版本。
记住TCSH全部的脚本文件的第一行的第一个字符必须是“#”字符。
比如:
#
#display"hello"
setstring="hello"
echoThevalueofstringis$string
set命令和重定向符号结合$<将用户输入的任何数据读入标准的输入中,下例中,把用户输入读入string变量中。
%setstring=$<
abc
%echo$string
abc
能够把提示符放置到相同的行用作echo的输入。
TCSH使用一个特殊的选项-n,将消除输出字符串中的回车符.光标将保留在输出字符串的结尾处。
%echo-npleaseenterastring
%cathello
#
echo-n"pleaseenterastring:
"
setstring=$<
echo"thevalueofstringis$string"
%chmodu+xhello
%hello
pleaseenterastring:
hello
thevalueofstringishello
%
三、操作符
TCSH有一系列标准的赋值,算术和关系运算以及重定向和后台操作等函数。
赋值运算符功能说明
=赋值操作
+=先加再赋值
-=先减再赋值
*=先乘再赋值
/=先除再赋值
%=取余再赋值
++自增量1
--自减量1
算术运算符说明
-负号
+加法
-减法
*乘法
/除法
%取余
关系运算符说明
>大于
<小于
>=大于等于
<=小于等于
!
=不等于
==等于
重定向和管道符
TCSH支持标准输入和标准输出的重定向和管道操作.如果设置了noclobber特征,要用重定向操作重写当前文件,需要用符号>!
代替>
四、控制结构
同其他shell一样,TCSH也有一系列的控制结构控制脚本的命令的执行。
while和if控制结构是最常用的控制结构,switch和foreach是更专用的控制结构。
switch是if条件的限定形式,检查数值是否等于一系列可能的数值中的一个数值。
foreach是循环结构的限定形式.浏览数值列表,给变量赋新的数值。
TCSH不同的控制结构列表:
1、条件控制结构;功能
if(expression)then注:
如果expression为真,则执行commands
commands
endif
if(expression)then注:
如果expression为真,则执行command1,否则执行
command1command2.
else
command2
endif
switch(string)加注:
允许在几条替换命令中选择,string为不同的模式
casepattern:
commands
breadsw
default:
commands
endsw
2、循环控制结构:
功能
while(expression)只要expression为真,则重复执行commands,
commands直到expression为假时跳出循环
end
foreachvariable(argument-list)迭代循环获得和argument-list中一样多的参数commands(每次循环variable被设置为列表的下一个参数;end操作方式同BSH)
TCSH中的控制结构有别于其他的shell,因为它更接近编程语言(C).TCSH的条件表达式的值为true/false.BASH和TCSH主要区别在于TCSH的结构不可重定向或进行管道输出.
五、测试表达式;()
if和while控制结构把表达式用作测试.表达式测试的结果为非零
(1)表示真,而零(0)表示假(跟BASH相反).测试表达式可由算术/字符串比较,但是字符串只能作相等和不相等的比较.而且表达式必须要在()括号内.
如:
if(expression)then
command
endif
TCSH有一系列的运算符来分别对字符串进行测试比较.正则表达式可以包含shell脚本的指令的字符串;
如:
if($var=~[Hh]*)then#如果变量$var以字母是大写/小写Hh开头,的字符串
echoinformation#执行命令
endif#结束
有很多测试文件的操作与BASH完全相同;如:
if(-rmyfile)then#测试myfile是否可读
echoinfo
endif
测试表达式的基本操作:
1、字符串比较:
功能
==是否相等,若相等返回真
!
=是否不等,若不等返回真
=~字符串和模式进行测试是否相等(模式为任意正则表达式)
!
~字符串和模式测试是否不等(模式为任意正则表达式)
文件测试:
功能
-e测试文件是否存在
-r测试文件是否可读
-w测试文件是否可写
-x测试文件是否可执行
-d测试文件名是否为目录
-f测试文件是否为普通文件
-o测试文件是否被用户所拥有
-z测试文件是否为空
2、逻辑运算符:
功能
&&与运算,两个条件同时蛮族
||或运算,有一个条件满足
!
取反
六、TCSH内建命令
1、数字变量@
在TCSH中,用@命令代替set命令来声明数字变量,然后进行算术,关系和位操作,数字和字符串变量是两个不同的对象,需要用不同的方法管理,不能把set用于数值变量的设置@命令由关键词,变量名,赋值运算符和表达式构成。
如:
%@num=10#注意空格
%@sum=2*($num+3)
%echo$sum
%26
2、alias
格式:
alias[name[command]]
关键词
alias别名name引用的命令command
如:
aliaslistls
aliaslist'ls-l'
3、argv
当脚本被执行时,命令行中的单词被分析并放入argv数组中。
argv[0],argv[1]...argv[n],其中argv[0]保存命令名,argv[1]保存命令的第一个参数,argv[n]命令的第n个参数。
argv数组元素可缩写元素号码,前面加$。
如:
$argv[1]写为$1;$argv[*]写为$*。
#argv参数标识符包含输入在命令行中的参数号码,可检查$#argv变量。
如:
arglist
#
echo"Thenumberofargumentsenteredis$#argv"
echo"Thelistofargumentsis:
$argv[*]"
%tcsharglistabc
Thenumberofargumentsenteredis3
Thelistofargumentsis:
abc
argv变量列表:
命令行参数说明
$argv[0]或$0命令名
$argv[n]或$n从1($1-$)开始的第n个命令行参数
$argv[*]或$*从1开始的所有命令行参数
$#argv或$#命令行参数的计数
4、bg
格式:
bg[%job]
bg命令把指定的任务放入后台。
如果此任务已经停止,则继续执行,如果没有参数,将当前任务放入后台。
(详细用法与BASH相同此处略)
5、break
格式:
break
break命令用于退出最接近的foreach/while循环过程,执行同一行中其他的命令。
6、breaksw
格式:
breaksw
可以从switch语句处中断,在endsw后继续执行。
7、builtins
列出全部shell的内建命令表.
8、cd
格式:
cd[-p][-l][-nl-v][name]
如果给出目录名,此命令把name设置为当前目录,如果命令中没有name,当前目录自动设置成用户主目录。
用于name的"-"引用上一级目录,如果参数name没有给出子目录,或不是全路径,或使用./或../引用当前目录及父目录,那么就检查在cdpathshell变量中列出的目录来寻找该目录名。
如果此操作失败,将检查shell变量中是否保存着的目录路径名。
用-p选项,linux显示目录列表,用-l,-n,-v选项与用在dirs命令中的选项完全相同。
默认选项-p;
9、continue
此命令继续执行最靠近while/foreach语句,当前行其余的命令被执行。
10、dirs
格式:
dirs[-l][-n|-v]
dirs-S|-L[filename]
dir-c
如果不带参数,dirs将显示目录列表,列表开头被列在作侧,第一个目录是当前目录。
带-l选项,用户主目录中的全部子目录被展开。
输入项在到达屏幕边缘时,-n选项隐藏输入项,-v选项显示每一行的输入项入口,-c选项将清除目录列表,-S选项可以把目录列表作为一系列的cd和pushed命令保存在文件中,-L选项可以从指定的文件中将cd和pushed命令读入,该文件包含-S选项所存储的cd和pushed命令。
如果没有指定的文件名,将使用赋值到dirsfileshell变量中的文件名。
如果没有设置dirsfile,将使用~/.cshdirs,在启动时注册shell将对dirs-L求值,如果设置了savedirs,退出前使用dirs-S,由于在~/.cshdirs之前,仅仅~/.tcshrc是正常来源,dirsfile应该以~/.tcshrc设置而不是以~/.login设置.
11、echo
格式:
echo[-n]word/string
此命令把每个单词或字符串写入shell的标准输出.可设置echostyleshell变量来仿真选项以及BSD的换码序列或者echo的SystemV版本;
12、eval
格式:
evalargument...
此命令把参数作为shell的输入,执行当前shell的上下文中的结果命令,由于分析发声在替换前,所以该命令通常用于执行命令或变量替代所产生的命令。
13、exec
格式:
execcommand
此命令代替当前的shell执行指定的命令,并退出终端;
14、exit
格式:
exit[expression]
shell可以带指定的表达式的值退出,如果没有包含表达式,也可带状态变量值退出。
15、fg
格式:
fg[%job...]
把指定的任务带到前台,如果任务在终止状态,在带到前台的同时使他运行;job参数是使用任务号或者下列字符串之一的任务引用:
'%+-
16、foreach
格式:
foreachvariable(listofvalues)
commands
end
foreach结构被设置为顺序引用数值列表,它类似BASHshell的forin结构.foreach结构产生两个操作数:
一个变量和一组包含在()中的数值列表.将列表中的值赋值到结构中的变量中.循环体的结尾由语句end构成.下例中脚本list输出由项目和foreach循环读取每一项当前的日期构成的一行信息,列表中的每一项被连续赋值到变量objectlist
#
settdate=`date+%D`
foreachobject(milkcookiesapplescheese)
echo$object$tdate
end
%tcshlist
milk04/26/03
cookies04/26/03
apples04/26/03
cheese04/26/03
使用foreach循环有助于管理文件,可以模式中的shell特定字符来产生用作数值列表的文件名列表,然后所产生的文件名列表就成为foreach结构引用的列表.如果在列表中不带任何变量,可以使用命令行参数实现循环.
list
#settdate=`date+D%`
foreachobject($argv[*])
echo"$object$tdate"
end
%tcshlistabc
a04/26/03
b04/26/03
c04/26/03
使用argv[*]特殊参数变量,可以直接引用命令行参数。
下例中,当调用shell脚本cbackuparg时,在命令行下输入C程序文件的列表,在foreach循环中,argv[*]引用命令行中的所有参数,将按顺序把各个参数赋值给变量backfile,变量argnum用于引用每个参数。
显示参数和backfile的值来说明它们两个是相同的。
cbackuparg
#
@argnum=1
foreachbackfile($argv[*])
cp$backfilesourcebak/$backfile
echo"$backfile$argv[$argnum]"
@argnum=$argnum+1
end
%cbackupargmain.clib.cio.c
main.cmain.c
lib.clib.c
io.cio.c
17、history
格式:
history[-hr][n]
history-S|-L|M[filename]
history-c
如果history没有任何参数,将显示开行号的历史命令列表。
用作参数的号码将列出行的最后号码,如果没有任何选项参数。
她将用作历史文件名;否则,将使用hisfile变量值。
用-h选项,将以注释的形式显示不带行号的历史文件列表
用-r选项,将反向显示,以最近的列表开始
用-c选项,则清除历史列表
如果用-S选项,可以把历史列表存入文件,如果savehistshell变量的第一个单词被设置为数值,历史文件将被保存为最大的行数,如果第二单词为'merge',历史列表将被合并到当前的历史文件中,而不替代历史列表,时间图章排序历史列表。
如果用-L选项,shell将从存储的历史列表文件中读取历史列表并把她追加到当前历史列表中。
如果用-M选项,将从历史文件读取历史列表信息,但用当前历史列表信息合并,排序历史列表。
如果没有用这些选项给出文件名,那么就使用赋值到histfileshell变量的文件名,如果没有设置histfile,就使用~/.history。
18、hup
格式:
hup[command]
如果带有括起来的command参数,hup运行command,根据停机信号退出。
当shell退出时,hup安排shell发出停机信号。
注意:
命令也许设置自己的停机响应,重写hup,如果没有参数(只有在shell脚本中才允许),hup使shell根据脚本的余项的停机信号退出。
19、if-then
格式:
if(expression)then
command
endif
if-then结构把条件放入几个linux命令,该条件是expression,如果expression得出非零的数值,那么expression为真,执行if结构内的命令,如果expression得出零值那么expression为假,就不执行if结构内的命令。
if-then结构以if关键词开始,expression表达式用()括起来,关键词then后可以跟任意数量的linux命令,以关键词endif结束if命令。
注意:
在TCSH中,if(expressiong)和then必须在同一行!
举例:
ifls
#
echo-n"Pleaseenteroption:
"
setoption=$<
if($option=="s")then
echoListfilesbysize
ls-s
endif
%tcshifls
Pleaseenteroption:
S
Listfilesbysize
total2
1monday2today
%
20、if-then-else
格式:
if(expressiong)then
command
else
command
endif
用户需要经常需要根据expression是真还是假来进行选择;关键词else允许if结构在两者之间选择;如果expression为真,那么执行第一个command,否则执行第二个就是else后面的command。
举例:
elsels
#
echoEnterstolistfilesizes
echootherwiseallfileinformationislisted
echo-n"pleaseenteroption:
"
setoption=$<
if($option=="s")then
ls-s
else
ls-l
endif
echoGood-bey
(结果略)
21、jobs
格式:
jobs[-l]
此命令列出所有活动的任务,如果带-l选项,将列出进程号,以及正常的信息.
22、kill
格式:
kill[-signal]%jobpid...
kill-l
此命令用于终止进程或者任务,如果带-signal选项,应该指定要发送的信号,默认发送的信号是SIGTERM,如果带有-l选项,则列出信号名,对于带-l选项提供的信号数,将列出与其相关的信号名。
23、logout
此命令用于终止注册shell,如果设置了ignoreeof,它将非常有用;
24、nice
格式:
nice[+number][command]
此命令设置shell调整优先为number,如果没有设置number,调整优先设置为4,带有指定的command,nice适当的优先运行command,number值越大,进程获得的CPU的时间就越少.
25、nohup
格式:
nohup[command]
如果不带command参数,nohup指示shell忽略任何停机信号,如果带command参数,将执行此命令并忽略执行中的任何停机信号.
26、notify
格式:
notify[%job...]
Linux执行命令后,如果有后台任务在执行,系统将通知到目前为止已经完成的后台任务,该系统不会中断如编辑这样的操作来通知用户关于完成的任务,当某任务完成时,如果想马上知道,无论系统在作什么,可以使用notify命令指令系统通知用户,它的参数作为任务号,当任务完成时,系统将中断当前命令并通知用户任务已经完成,如:
%notify%2
当2号任务完成时,告诉系统通知用户.
27、onintr
格式:
onintr[-|label]
此命令控制shell在中断时的动作,不带任何参数,将回复shell中断默认的动作,将终止shell脚本或返回输入级的终止符,如果带-参数,则忽略全部的中断,当接受中断或当子进程终止时,带label的命令将使shell执行goto标号.
28、popd
格式:
popd[-p][-l][-n|-v][+n]
此命令从目录列表中删除一个目录,不带参数的命令从列表中删除顶层目录,+n删除从左起的第n层的目录.然后popd显示最终的目录列表.pushdsilentshell变量可以设置为支持此特性,-p选项可以重写pushdsilent.
29、printenv
格式:
printenv[name]
此命令显示环境变量的名和值,如果带name参数,仅仅显示环境变量name的值.
30.pushd
格式:
pushd[-p][-l][-n|-v][name|+n]
此命令把目录添加到存储的目录列表中,然后显示目录列表,如不带参数,除非目录为空,pushd交换顶层的两个目录,并返回0.
+n旋转列表以便使第n个目录(从左起)列与顶端,但是,如果设置了dextract,pushd+n将展开第n个目录,把它压入堆栈顶层.
-n旋转堆栈以便第n个目录(从右起)列于顶端,dir把dir添加到顶端的目录列表,是她成为新的当前目录.如果设置了pushtohome,不带参数的pushd命令执行pushd~的功能,像cd的功能一样,如果dunique被设置,pushd在压入堆栈之前从堆栈中删除任何的name历程,可以设置pushdsilentshell变量来取消目录列表的显示,然后可以使用-p选项重写pushdsilent.
31、repeat
格式:
repeatcountcommand
此命令重复执行command指定的次数count.
32、set
格式:
set
setname...
setname=value...
setname=(wordlist)...
setname[index]=word...
set-r
set-rname...
set-rname=value...
set-rname=(wordlist)...
不带任何参数的set命令将显示全部的shell变量值,包含许多单词的变量作为放在括号中的词列出,带name参数的set命令定义一个变量并为它赋值null串,带有name和=符号分隔的值,set定义变量并给它赋值,要把wordlist作为值赋值给name变量,把列表中的词作为要赋的值放在括号中,为了将数值赋值给数组元素,使用方括号[]指定元素的index,但是该元素必须已经存在.
-r选项常用于引用只读变量,仅仅带-r选项的set命令将列出只读变量,与变量名一起使用,set将使此变量设置为只读,与赋值的变量一起使用,将初始化该变量,并使该变量成为不能被修改的只读变量.
在TCSH中,用户必须在使用