本文共 4334 字,大约阅读时间需要 14 分钟。
当你执行一个shell script时, 系统会检查script文件的第一行以确定如何执行 其中的命令:
1. [建议您使用明确的写法,即用#!/bin/csh(sh)]2. 如果你想快速执行Cshell, 即不想读入Cshell的启动程序(.cshrc等), 在script文件的第一行应该用类似下面的格式: #!/bin/csh -f script
如何将命令行的参数传给script呢? 可以这样: 键入script名, 后面跟任何你想要传 递的参数. Cshell把script名后面的字符按照词(words)来划分后传递给一个叫做 argv的变量数组, 叫做arguments list. 这样命令行的参数就作为words存储于argv 中, 连同script名, 分别可以被引用为argv[0], argv[1], ... argv[n], 或者你也 可以用等效的方法即$0,$1,...,$n来引用它们,其中n是参数的个数.
除了argv, $0, $1, ... $n, 等以外, 你还可以在script中使用其他变量. 有许多符号可以对变量进行操作: 读取, 赋值, 判断属性等等. 分述如下:
判断变量是否存在, 若存在(被set过)则等于 1 . 否则等于 0 . 例如: % set var='abc' % echo $?var #结果为 1 % unset var % echo $?var #结果为 0
计算变量name中的词(words)数. 例如: % set var=(a b c) # $#var == 3 % set var='abc' # $#var == 1 % unset var # var: Undefined variable.
重定向符号. 即从终端读入(一行). 比如: echo -n "yes or no?" set a=($<) 即变量a从终端输入. (如果你输入了一个空行或^D, $#a将等于 0 )
$n和$argv[n]实际上有个微小的差别: 当n大于参数个数($#argv)时, $argv[n]要报错, 而$n永远也不会有这种"下标溢出"的错. 对其他变量, 也不会发生"下标溢出"的错误, 例如: 当(n > $#var) 时, $var[n-]不给任何结果和错误信息. 而$var[m-n]给出$var[m]到$var[$#var]的words. 如果(m > $#var) 则没有任何结果.
-e 文件存在返回1(.true.), 否则返回0(.false.). -r 文件可读返回1,否则返回0. -w ....可写................ -x ....可执行............... -o 文件属于用户本人返回1, 否则返回0. -z 文件长度为0返回1, 否则返回0. -f 文件为普通(plain)文件返回1, 否则返回0. -d 文件为目录文件时返回1, 否则返回0.
你可以对路径名进行操作, 以便于去掉你不需要的部分.:t (tail)只保留路径名最右边的部分, 而将前面的全部去掉. (相当于basename):r (root)去掉从"."(dot)开始的后缀部分.:e (end)去掉从左边开始一直的"."的前缀部分.:h (head)去掉最后的一部分, 只保留文件所在的目录名.
比如, 你有一个叫做 /usr/people/user1/file1.txt的文件,在script中将它赋值给变量var_file, 则:$var_file:t == file1.txt$var_file:r == /usr/people/user1/file1$var_file:e == txt$var_file:h == /usr/people/user1
严谨的程序应该测试返回代码以判断该程序是正常结束还是别的情况. 尤其在你写前后相关的script的时候, 后面的命令要用到前面命令的执行结果的时候.
一个命令执行后的返回代码存放在叫做status的变量中, 当命令执行成功正常退出时 status为0, 否则为1.
比如你想检查前面一个命令是否正常地被执行了, 从而判断下一个命令是否应该执行, 就可以:
command1set checkpoint=$status[commands...]if(! $checkpoint) then command2else command3endif
Cshell中基本的控制结构包括 foreach, if结构, 另外还有switch及while, 当然还有那个从程序设计概念提出来开始就一直存在的幽灵: goto.
语法为:foreach variable (variable_value lists) {commands}end
变量variable依次取lists中的值, 执行command(s)命令. lists中给出多少个值, 就 进行多少次操作. 结束循环后变量variable的取值为lists中的最后一项.
语法为:if ( expression ) then [commands]else [commands]endif
另外还可以用else if:if ( expression ) then [commands]else if ( expression ) then [commands]else [commands]endif
还可以用简化格式:if ( expression ) command或者if ( expression ) \ command# "\"(backslash)后面只能接newline(回车即可), 不能有任何其他字符;# 单个命令command不能包括"|", "&" 以及";". 也不能使用其它控制语句.
不能使用下面的格式:if ( expression )then或者if ( expression ) then command endif
语法为:while ( expression ) [commands]end# while中也可以使用break以终止循环.
例程(本例执行10次循环):#!/bin/cshset ai=1while ( $ai <= 10 ) echo the ${ai}th time running. @ ai++end
语法为:switch ( $word )case str_1: [commands] breaksw...case str_n: [commands] breakswdefault: [commands] breakswendsw# word为控制变量, breaksw 跳出 switch 操作.
语法为:goto label例如(此例为无限循环!):loop: [commands] goto loop
转载地址:http://rsuli.baihongyu.com/