d9JLinux联盟 无论何时调用shell脚本,都将产生自己的shell,如果shell脚本被另外一个shell脚本d9JLinux联盟 执行,它将使自己的shell从第一脚本的shell中分离.现在有两个shell,属于第一个d9JLinux联盟 脚本的父shell和当执行第二个脚本是产生的子shell.在其他的shell内部执行脚本d9JLinux联盟 时,这个shell是第一个脚本的子shell,原来的脚本的shell是它的父shell.d9JLinux联盟 每个shell都拥有自己的变量,子shell不能引用父shell中的局域变量,但是能引用d9JLinux联盟 环境变量.子shell可以引用父shell中声明的任何环境变量.d9JLinux联盟 d9JLinux联盟 34,shiftd9JLinux联盟 格式:d9JLinux联盟 shift [variable]d9JLinux联盟 没有参数的shift命令向左移动argv数值,即argv[1]的数值被argv[2]所代替,如果d9JLinux联盟 argv没有被设置或者数值少于一个词时将发声错误.带有其数值为列表或数组的d9JLinux联盟 variable,该命令将列表和数组的数值向左移动.d9JLinux联盟 d9JLinux联盟 35,sourced9JLinux联盟 格式:d9JLinux联盟 source [-h] name [argument...]d9JLinux联盟 source读出并执行以name命名的命令,通常是shell脚本(不能把这些命令放在历史d9JLinux联盟 列表中).把任何参数输入argv中.用-h选项,命令被放入历史列表但是不立即执行.d9JLinux联盟 d9JLinux联盟 36.stopd9JLinux联盟 格式:d9JLinux联盟 stop %job\ job...d9JLinux联盟 stop命令停止指定的任务或在后台执行的进程.也可以用一个数字或字符串引用一个d9JLinux联盟 任务,如果不存在默认的任务,那么仅仅stop不能停止当前的任务.d9JLinux联盟 d9JLinux联盟 37,switchd9JLinux联盟 格式;d9JLinux联盟 源码:--------------------------------------------------------------------------------d9JLinux联盟 switch (test-string)d9JLinux联盟 case pattern:d9JLinux联盟 commandsd9JLinux联盟 breakswd9JLinux联盟 case pattern:d9JLinux联盟 commandsd9JLinux联盟 breakswd9JLinux联盟 default:d9JLinux联盟 commandsd9JLinux联盟 breakswd9JLinux联盟 endswd9JLinux联盟 --------------------------------------------------------------------------------d9JLinux联盟 d9JLinux联盟 switch结构在几个可能的选项中进行选择.此结构与BASH中的case结构非常类似d9JLinux联盟 通过把字符串与几个可能的模式进行选择,每个可能的模式都与一系列命令相关d9JLinux联盟 联,如果没有相匹配的项,则执行相关的命令,.switch结构以关键词switch和放在d9JLinux联盟 圆括号中的test-string开始,字符串常由变量求值导出,然后是一系列的模式,每个d9JLinux联盟 模式pattern前是关键词case,以冒号:结束,冒号后列出与选择有关的commands,以d9JLinux联盟 breaksw终止command,在所有被列出的模式之后,关键词endsw结束switch结构,注意,d9JLinux联盟 每个测试表达式的命令组的最后一个命令是breaksw,每个测试表达式被逐一测试,d9JLinux联盟 直到找到相匹配的内容,如果没有找到相匹配的项,则执行默认项default.用关键词d9JLinux联盟 default表示默认选择,default项是可选的.但是它有助于通知用户没有匹配的测试d9JLinux联盟 字符串.举例:d9JLinux联盟 源码:--------------------------------------------------------------------------------d9JLinux联盟 lschoiced9JLinux联盟 #d9JLinux联盟 echo s.List sizesd9JLinux联盟 echo l.List files infomationd9JLinux联盟 echo c.List C filesd9JLinux联盟 echo -n "Please enter choice:"d9JLinux联盟 set choice=$<d9JLinux联盟 switch ($choice)d9JLinux联盟 case s:d9JLinux联盟 ls -sd9JLinux联盟 breakswd9JLinux联盟 case l:d9JLinux联盟 ls -ld9JLinux联盟 breakswd9JLinux联盟 case c:d9JLinux联盟 ls *.cd9JLinux联盟 breakswd9JLinux联盟 default:d9JLinux联盟 echo Invalid Optiond9JLinux联盟 breakswd9JLinux联盟 endsw--------------------------------------------------------------------------------d9JLinux联盟 d9JLinux联盟 (输出略)d9JLinux联盟 d9JLinux联盟 38,timed9JLinux联盟 格式:d9JLinux联盟 time [command]d9JLinux联盟 如果没有参数,此命令显示当前shell的时间累计,用一条命令作为参数,它执行命令d9JLinux联盟 并显示时间累计.d9JLinux联盟 d9JLinux联盟 39,umaskd9JLinux联盟 格式:d9JLinux联盟 umask [value]d9JLinux联盟 此命令指定用户文件建立掩码,掩码用八进制表示.d9JLinux联盟 d9JLinux联盟 40,unaliasd9JLinux联盟 格式:d9JLinux联盟 unalias patternd9JLinux联盟 此命令删除其名称与pattern匹配的所有别名.d9JLinux联盟 d9JLinux联盟 41,unsetd9JLinux联盟 格式:unset patternd9JLinux联盟 此命令取消定义shell变量,名称可能是匹配了几个变量的pattern(尽量避免用d9JLinux联盟 unset *,因为它将取消所有的变量)d9JLinux联盟 d9JLinux联盟 42,unsetenvd9JLinux联盟 格式:d9JLinux联盟 unsetenv patternd9JLinux联盟 此命令取消定义环境变量,名称可能是匹配几个变量的pattern,也尽量避免用d9JLinux联盟 unsetenv *,因为它将删除所有的环境变量.d9JLinux联盟 d9JLinux联盟 43,waitd9JLinux联盟 此命令指示shell等待全部的后台任务的完成,在一个交互的shell环境中,可中断d9JLinux联盟 一个wait操作,并显示剩余的任务.d9JLinux联盟 d9JLinux联盟 44,whered9JLinux联盟 格式:where commandd9JLinux联盟 此命令报告所有已知的命令历程,包括别名,内建和可执行的路径.d9JLinux联盟 d9JLinux联盟 45,whichd9JLinux联盟 格式:d9JLinux联盟 which commandd9JLinux联盟 此命令显示shell要执行的指定的任务.d9JLinux联盟 d9JLinux联盟 46,whiled9JLinux联盟 格式:d9JLinux联盟 while(expression)d9JLinux联盟 commandd9JLinux联盟 endd9JLinux联盟 此循环重复执行命令,以关键词while开始,接着是圆括号括起来的表达式expressiond9JLinux联盟 以end结束循环.d9JLinux联盟 while循环很容易与switch结构结合,构成菜单的驱动程序.举例:d9JLinux联盟 d9JLinux联盟 源码:--------------------------------------------------------------------------------lschoiceswd9JLinux联盟 #d9JLinux联盟 set again=yesd9JLinux联盟 while ($again==yes)d9JLinux联盟 echo "1.List sizes"d9JLinux联盟 echo "2.List files information"d9JLinux联盟 echo "3.List C files"d9JLinux联盟 echo "4.Quit"d9JLinux联盟 echo -n "Please enter choice:"d9JLinux联盟 set choice=$<d9JLinux联盟 switch ($choice)d9JLinux联盟 case 1:d9JLinux联盟 ls -sd9JLinux联盟 breakswd9JLinux联盟 case 2:d9JLinux联盟 ls -ld9JLinux联盟 breakswd9JLinux联盟 case 3:d9JLinux联盟 ls *.cd9JLinux联盟 breakswd9JLinux联盟 case 4:d9JLinux联盟 set again=nod9JLinux联盟 echo good-beyd9JLinux联盟 breakswd9JLinux联盟 default:d9JLinux联盟 echo Invalid Optiond9JLinux联盟 endsw--------------------------------------------------------------------------------d9JLinux联盟 d9JLinux联盟 (输出略)d9JLinux联盟 TCSH配置d9JLinux联盟 TCSHshell可以使用户使用shell配置变量和特征配置自己的shell.也可以使用setd9JLinux联盟 命令设置特征.TCSH也有注册,注消以及何时进入TCSHshell的配置文件.d9JLinux联盟 一,TCSH shell 特征d9JLinux联盟 TCSH有几个特征,允许控制不同的shell操作的方法.TCSH shell特征不仅包括许多它d9JLinux联盟 自己的特征,而且还包括KSH/BASH shell中的特征,如,TCSH中有一个noclobber,d9JLinux联盟 防止重定向重写文件,,一些更常用的特征为:echo,noclobber,ignoreeof和noglob.d9JLinux联盟 通过定义和取消定义与该特性相关的变量,打开/关闭TCSH shell特征,为每个特征命名d9JLinux联盟 变量.例如,通过定义noclobber变量,打开noclobber特征.使用set命令定义变量,而d9JLinux联盟 使用unset命令取消定义变量.为了运行noclobber特征,使用set noclobber,为了关d9JLinux联盟 闭它,使用unset noclobber.如:d9JLinux联盟 set variable 定义变量d9JLinux联盟 unset variable 取消变量d9JLinux联盟 由于这些变量常用于打开/关闭特征,所以有时也被叫做双态切换.d9JLinux联盟 d9JLinux联盟 1,echod9JLinux联盟 在echo被执行之前,设置echo启动显示命令的特征.d9JLinux联盟 set echo 打开echo特征d9JLinux联盟 unset echo 关闭echo特征d9JLinux联盟 d9JLinux联盟 2,ignoreeofd9JLinux联盟 设置ignoreeof启动防止用户使用CTRL+D注消用户shell的特征,它用于防止突发性d9JLinux联盟 的注消操作,如果此特征关闭,可以用CTRL+D注消过程.由于在标准输入中CTRL+D是d9JLinux联盟 结束用户输入的操作,所以很容易造成突发注消shell进程.因此,ignoreeof特征就d9JLinux联盟 能防止这种突发的注消,当此特征被设置后,用户必须用logout命令明确注消.d9JLinux联盟 d9JLinux联盟 3,noclobberd9JLinux联盟 设置noclobber启动预防现有文件不被重定向输出的特征,借助此特征,如果把输出d9JLinux联盟 重定向到已经存在的文件中,就不用标准的输出重写文件.原文件被保存.也许会发d9JLinux联盟 生这种情况:把现有文件名用作保存被重定向的输入的文件名.因此,noclobber特征d9JLinux联盟 使用户不会意外的重写原文件.d9JLinux联盟 %set noclobberd9JLinux联盟 %cat oldfile > newfiled9JLinux联盟 newfile: file existd9JLinux联盟 有时,用户想用重定向输出重写某个文件,那么就可在重定向符号操作符之后放置d9JLinux联盟 惊叹号!实现重写操作.这将重写noclobber特性,用标准的输出代替文件内容.d9JLinux联盟 %cat oldfile >!newfiled9JLinux联盟 d9JLinux联盟 4,noglobd9JLinux联盟 设置noglob使某特性有效,该特征禁止用户shell中的某些字符.字符 * ? [ ] ~将d9JLinux联盟 不再扩展为匹配的文件名.如:d9JLinux联盟 %set noglobd9JLinux联盟 %ls myfile?*d9JLinux联盟 myfile?*d9JLinux联盟 d9JLinux联盟 附录:常用的TCSH shell特征:d9JLinux联盟 特征 功能d9JLinux联盟 set 打开shell特征d9JLinux联盟 unset 关闭shell特征d9JLinux联盟 echo 执行命令前显示该命令d9JLinux联盟 ignoreeof 禁止用CTRL+D注消d9JLinux联盟 noclobber 不必通过重新定向重写文件d9JLinux联盟 noglob 禁止特殊字符用于文件名扩展:* ? ~ [ ]d9JLinux联盟 notify 当完成后台任务时立即通知用户d9JLinux联盟 verbose 历史命令引用后显示命令d9JLinux联盟 d9JLinux联盟 二,TCSH shell 变量d9JLinux联盟 正如在BASH shell中一样,也可在TCSH shell中使用特殊shell变量来匹配自己的系统.d9JLinux联盟 一些变量在系统初始化中定义,也可以在shell中用新的值重新定义变量,有些必须在d9JLinux联盟 系统初始化时定义,如最常用的特殊变量prompt变量,它允许建立自己的命令行提示符d9JLinux联盟 另外一个是history变量,该变量确定保存了多少历史命令/事件. 在TCSH shell中,许d9JLinux联盟 多特殊变量的名称与函数都与BASH/ZSH shell中的变量名称和函数类似.一些必须用d9JLinux联盟 大写表示,但是大多数用小写表示.某些特殊变量起类似的作用,但是具有完全不同的d9JLinux联盟 实现方法,如mail变量保存的信息与BASH shell的MAIL,MAILPATH,MAILCHECK变量保存d9JLinux联盟 的信息完全相同.d9JLinux联盟 1,prompt prompt2 prompt3d9JLinux联盟 这三个变量为命令行保存提示符.用户可以设置自己想要的符号/字符串作为提示符.d9JLinux联盟 为了设置命令行提示符,可以用d9JLinux联盟 %set prompt="+"d9JLinux联盟 +d9JLinux联盟 这样提示符就变成了+号.也可以使用预定义的一组代码使得配置提示符更容易,在每个d9JLinux联盟 代码前加个%号,例如,用%/表示当前的工作目录,%t表示时间,%n表示用户名,%!表示d9JLinux联盟 下一个历史事件的号码,如:d9JLinux联盟 %set prompt="%/"d9JLinux联盟 /home/dirnamed9JLinux联盟 代码列表:d9JLinux联盟 代码 说明d9JLinux联盟 %/ 当前运行目录d9JLinux联盟 %h,%!,! 当前历史号码d9JLinux联盟 %t 当天时间d9JLinux联盟 %n 用户名称d9JLinux联盟 %d 日期d9JLinux联盟 %w 当前月份d9JLinux联盟 %y 当前年份d9JLinux联盟 当命令分为若干行输入时,变量prompt2被用于特殊情况,为需要输入改命令而增加的d9JLinux联盟 行显示prompt2,prompt3提示符用于检查拼写特征是否被激活.d9JLinux联盟 d9JLinux联盟 2,cdpathd9JLinux联盟 cdpath变量保持目录的路径名,用cd搜索特定的子目录,这些路径名形成一个数组,就d9JLinux联盟 像赋值给TCSH shell的path变量的路径名数组一样,注意在路径名之间要求有空格.d9JLinux联盟 %set cdpath=(/usr/bin /var/bin /home/username)d9JLinux联盟 d9JLinux联盟 3,history和savehistd9JLinux联盟 正如前面了解的那样,history变量常用于确定要保存的历史事件的数量,只需给该变量d9JLinux联盟 赋值history应该记录的事件的最大的数值.当达到最大值时,计数器从1开始.但是当d9JLinux联盟 注消时,savehist变量保存存储在.history文件中事件的数量,当再次注册时,这些事件d9JLinux联盟 就成为初始化历史事件.如:d9JLinux联盟 %set history=20d9JLinux联盟 %set savehist=5d9JLinux联盟 当注册时,历史列表中将记录20个事件,但是当注消后,仅仅最后5个事件被保存在d9JLinux联盟 .history文件中,下一次注册时,历史列表将由以前的最后5个命令组成.d9JLinux联盟 d9JLinux联盟 4,maild9JLinux联盟 在TCSH shell中,mail变量综合了BASH和ZSH shell中的MAIL,MAILCHECK,MAILPATHd9JLinux联盟 变量的特征.TCSH shell mail变量值是一个数组,该数组的元素既包括检查电子邮件d9JLinux联盟 的时间间隔,又包括检查电子邮箱文件的路径.要给这些元素赋值,可以把赋值的数组d9JLinux联盟 赋值给mail变量,用圆括号括起来,空格分割的一系列指定数组的新值.第一个值是再次d9JLinux联盟 检查电子邮件前设置等待的秒数,它类似BASH shell的MAILCHECK变量保存的数组.其余d9JLinux联盟 的值由电子邮箱文件的路径构成,检查该文件获取邮件.注意,这些变量保存了BASHd9JLinux联盟 和ZSH shell MAIL,MAILPATH变量的功能. 如:d9JLinux联盟 %set mail ( 1200 /usr/mail/user)d9JLinux联盟 mail变量被设置成每1200秒检查一次电子邮件,被检查的电子邮箱文件在/usr/mail/userd9JLinux联盟 目录中.d9JLinux联盟 %set mail (1200 /usr/mail/user /home/userdir)d9JLinux联盟 也可以容易的给mail数组添加更多的邮箱文件路径,注意每个元素之间的空格.d9JLinux联盟 d9JLinux联盟 附常用的TCSH shell配置变量:d9JLinux联盟 变量 说明d9JLinux联盟 home 用户主目录的路径名d9JLinux联盟 user 注册名d9JLinux联盟 pwd 当前运行目录的路径名d9JLinux联盟 shell 用于注册过程的程序路径名d9JLinux联盟 prompt 主提示符d9JLinux联盟 path 目录路径名列表,搜寻目录获取可执行命令d9JLinux联盟 mail mail实用程序检查该变量来获取接受信息的邮件文件名d9JLinux联盟 cdpath cd命令搜索该变量获取子目录的目录路径名d9JLinux联盟 history 历史列表中命令数量d9JLinux联盟 savehist 为下一个注册存储历史列表中的命令数量d9JLinux联盟 EXINIT EX/vi编辑器的初始化命令d9JLinux联盟 TERM 终端名d9JLinux联盟 d9JLinux联盟 三,TCSH shell初始化文件d9JLinux联盟 TCSH shell有3个初始化文件: .login .tcshrc .logout,.login文件是每次注册时d9JLinux联盟 执行的注册初始化文件, .tcshrc文件是每次进入TCSH shell时执行的shell初始化d9JLinux联盟 文件, 该文件在注册时执行或者用tcsh命令直接从另一个shell进入TCSH shell时d9JLinux联盟 执行,每次注消时执行.logout文件d9JLinux联盟 1, .logind9JLinux联盟 TCSH shell有自己注册初始化login,该文件用于配置用户shell的shell命令和特殊d9JLinux联盟 变量定义, .login文件相当于BASH和ZSH shell中使用的.profile文件.d9JLinux联盟 .login文件包含setenv命令,给TERM之类的特殊环境变量赋值,可以用任何标准的编d9JLinux联盟 辑器编辑它,改变这些值,也可添加新的值.但是要记住:在TCSH shell中,为环境变量d9JLinux联盟 赋值的命令是setenv,如:d9JLinux联盟 %setenv EXINIT 'set nu ai'd9JLinux联盟 定义EXINIT变量并设置vi编辑器行计数和自动缩排的功能.d9JLinux联盟 d9JLinux联盟 当编辑.login文件时要十分小心,不经意的编辑可能造成错误的变量设置或者根本没有d9JLinux联盟 设置变量,因此,编辑之前最好备份.login文件.如果更改了.login文件,想让这些变化d9JLinux联盟 在当前注册期间生效,需要使用source命令重新执行该文件,source命令实际上可执行d9JLinux联盟 任何初始化文件,其中包括.tcshrc文件和.logout文件,如:d9JLinux联盟 %source .logind9JLinux联盟 d9JLinux联盟 2, .tcshrcd9JLinux联盟 每当进入TCSH shell或产生任何子shell时,就执行.tcshrc初始化文件,如果TCSHd9JLinux联盟 shell是用户注册的shell,那么当用户注册时, .tcshrc文件和.login文件一起运行,d9JLinux联盟 如果从另外一个shell进入TCSH shell, .tcshrc文件被自动执行,文件中包含的变量d9JLinux联盟 和别名被定义.d9JLinux联盟 实际上,每当产生一个shell时,如运行shell脚本,就执行.tcshrc文件,也就是说,每d9JLinux联盟 当创建一个shell时,就执行.tcshrc文件,这允许在.tcshrc中定义局部变量,在某种d9JLinux联盟 意义上说,局部变量可以进入任何子shell,即时像history这样的用户定义的变量也d9JLinux联盟 是局部变量,但要为每个产生的子shell定义特殊变量,这样,为每个子shell变量设置d9JLinux联盟 history,但是,每个子shell都有自己的局部history变量,用户甚至可在不影响其他d9JLinux联盟 子shell的变量的情况下改变一个子shell的局部history变量,在shell初始化文件d9JLinux联盟 中定义特殊变量可以看做是BASH shell导出变量,在BASH shell和ZSH shell中的导出d9JLinux联盟 变量只把自己的拷贝传送给子shell,改变拷贝不会影响原始定义.d9JLinux联盟 .tchsrc文件也可包含别名变量和用于打开shell特征的特征变量,别名变量和特征d9JLinux联盟 变量是局部变量,限定于shell内部.但是.tcshrc文件在每个shell中都将定义这些d9JLinux联盟 变量.因此, .tcshrc文件通常保存各种命令定义的别名,如:d9JLinux联盟 .tcshrcd9JLinux联盟 #d9JLinux联盟 set shell=/usr/bin/cshd9JLinux联盟 set path=$PATH (/bin /usr/bin .)d9JLinux联盟 set cdpath=(/home/dirname/filename /home/dirname/files)d9JLinux联盟 set prompt="!$pwd>"d9JLinux联盟 set history=20d9JLinux联盟 set ignoreeofd9JLinux联盟 set noclobberd9JLinux联盟 alias rm 'rm -i'd9JLinux联盟 alias mv 'mv -i'd9JLinux联盟 alias cp 'cp -i'd9JLinux联盟 与环境变量不同,局部变量用set命令定义,在.tcshrc文件中的局部变量应该使用d9JLinux联盟 set命令定义,用setenv命令定义的环境变量是放在.login文件中的,请记住:当改变d9JLinux联盟 path或cdpath的路径名时,数组中包含这些路径名,数组中的每个元素要用空格分开,d9JLinux联盟 如果添加新的路径名时,必须保证用空格把它和其他的路径名分开.如果已经改变了d9JLinux联盟 .tcshrc文件,希望这些变化在当前注册中立即生效,别忘了用source命令重复执行d9JLinux联盟 .tcshrc文件.d9JLinux联盟 d9JLinux联盟 3, .logoutd9JLinux联盟 .logout文件也是初始化文件,只不过它在注消时执行,用户可以设置.logout文件以使d9JLinux联盟 其完成任何在注消时想要完成的操作,文件中没有定义变量,常包括关闭进程的shelld9JLinux联盟 命令.可以向.logout文件中添加自己的shell命令,如:d9JLinux联盟 .logoutd9JLinux联盟 #d9JLinux联盟 cleard9JLinux联盟 echo "Good-bey..."
|