摘要:Bash与tcsh是目前Unix/Linux操作系统中两种流行的shell。通过举例,对这两种shell常用的功能和特性进行了对比,内容包括变量赋值、数组、环境设置、命令参数、数值计算、条件流程控制、循环语句和信号处理等。这些比较是对这二者主要区别的一个很好的总结,能够为bash与tcsh的学习和使用者提供便利和帮助。
关键词:Unix;Linux;Bash;Tcsh
中图分类号:TP316文献标识码:A文章编号:1009-3044(2008)33-1390-03
Main Differences between Bash and Tcsh by Examples
SHI Qing-dong
(Motorola (China) Technologies Ltd., Beijing 100102, China)
Abstract: Bash and tcsh are two kinds of popular shell in the present Unix/Linux operating system. Through some examples, this paper has carried on the contrast to more commonly used functions and the characteristics of the two kinds of shell, the content including variable assignment, array, environment setting, command parameters, numerical calculus, condition flow control, looping construct, signal-catching and so on. The contrast is a very good summary that distinguish the two, which can provides convenience and help for the bash and tcsh learners and users.
Key words: Unix; Linux; Bash; Tcsh
1 引言
Shell是提供用户与操作系统之间交互的特殊程序,它是一个解释器,解释用户输入的命令。Tcsh与bash是Unix/Linux操作系统中两种最常用的shell。Bash,即Bourne Again shell,是Bourne shell的超集,是绝大多数Linux操作系统的缺省shell,直观而又灵活,适于初学者使用,同时对高级和专业用户来说也是一个强有力的工具。Tcsh,即Turbo C shell,是csh(C shell)的超集,语法类似于C语言,因为C语言的广泛使用,tcsh受到广大程序员的青睐。下面通过举例,谈谈二者主要的不同点。
2 变量赋值
给变量赋值,bash直接赋值即可,tcsh则需要使用set命令(见表1)。
Bash与tcsh都可以将某个命令的输出赋给一个变量,赋值时,命令的两边为反引号,即`command`,bash还可以用$(command)。下例,将date命令的输出(当前日期)赋给变量today(见表2)。
Bash与tcsh都能够通过键盘输入对变量赋值。Bash使用read命令读取键盘输入,tcsh使用set命令,并有两种方法,一种使用"$
3 数组
Bash与tcsh都支持数组,其赋值方法与普通变量的一致。需要注意的是,bash数组的下标从0开始,tcsh的从1开始(见表4)。
修改某个元素的值,并显示数组所有元素及元素个数(见表5)。
4 环境设置
对于bash用户,可以修改其主目录下面的隐藏文件.bashrc来设置自己的环境; tcsh相应的文件是.tcshrc。最常见的环境设置项包括环境变量、别名和系统提示。
4.1 环境变量设置
设置环境变量时,bash使用export命令,tcsh使用setenv命令。例如,在搜索路径后面添加/usr/sbin(见表6)。
4.2 别名设置
设置别名时,bash需要带等号,tcsh不能带等号。下列,设置别名后,运行xe就相当于运行/usr/bin/xemacs(见表7)。
4.3 系统提示设置
对于bash,通过设置内置变量PS1来设置系统命令行提示符,比较常见的是将PS1设为"[\h] \w \$ ",\h表示机器名,\w表示当前工作目录,当前工作目录为用户的主目录时显示为~,\$显示为$。Tcsh相应的内置变量是prompt,比较常见的是将prompt设为"[%m] %~ %# ",%m表示机器名,%~表示当前工作目录,同样,当前工作目录为用户的主目录时显示为~,%#显示为>。下列当中,bash环境的机器名为terrylnx01,tcsh环境的机器名为margesrv02(见表8)。
对PS1和prompt的设置,都各自有很多可选项,这里就不一一列举了。此外,bash还有PS2、PS3和PS4等用于设置系统提示的内置变量,tcsh还有prompt2和prompt3等内置变量。
5 命令参数
Bash和tcsh脚本都可以带参数,bash通过$1、$2、$3等读取参数;tcsh既可以用$1、$2、$3,也可以用$argv[1]、$argv[2]、$argv[3]等读取参数。Bash通过$#得到参数个数;tcsh则用$#argv,也可以用$#得到参数数量。下面两段脚本作用相同,先打印人数(参数个数),然后向第一个人(参数)说Hello(见表9)。
6 数值计算
Bash的数值计算要么在双括号中进行,要么在let后面进行;tcsh的数值计算在@后面进行,@的后面和双目运算符的两边必须有空格(见表10)。
7 条件流程控制
7.1 条件判断
Bash与tcsh对于两个整型数的比较判断符不一样,见表11。
对于字符串,tcsh只能比较两个字符串是否相等,而bash能够按照字典顺序判断两个字符串的大小关系。判断字符串是否为空串,bash可以用“-z $string”,而tcsh只能通过与空串的比较来判断(见表12)。
7.2条件控制
Bash和tcsh都有if、if/else、if/elseif/else和switch/case等条件控制语句,二者条件控制语法的思想是一致的,具体的语法是不同的。表13中两段脚本的作用相同,根据分数score的值,输出及格Pass或者不及格Fail。
下面两段脚本的作用也是相同的,变量day的值为1、2、3时,对应地输出Monday、Tuesday或Wednesday(见表14)。
8 循环语句
Bash支持while和until循环,tcsh支持while循环而不支持until循环。下面两段脚本的作用相同,计算1+2+…+100的值,结果存储在变量sum中(见表15)。
Bash支持for循环,tcsh也支持,但关键字是foreach。下面两循环语句作用相同,将主目录下的所有的txt文件备份,文件名后面加“_bak”作为备份文件名(见表16)。
另外,tcsh支持goto和repeat语句,bash不支持。例如,repeat 5 uname就是执行5次uname命令。
9 信号处理
Bash用trap命令捕捉信号以及采取相应的处理动作,语法格式为trap 'command-list' signal。Tcsh相应的命令为onintr,语法格式为onintr [-| label],此命令控制tcsh在被中断时的动作:不带任何参数,将采取默认的动作,即中断shell,回到脚本开始运行的地方;如果带-参数,则忽略中断;如果用label参数,tcsh将执行goto label,即执行label标号后面的命令。下面两段脚本的作用相同,每2秒打印一次“Program is running”,当输入Ctrl-C时,打印“Interrupt”并终止运行(见表17)。
10 结束语
Bash与tcsh都拥有各自的内置命令和变量,二者间不是一一对应的,有些能够找到对应的命令或变量,有些则不能,从前面的内容可以发现这一点,再例如,bash支持函数和select语句,tcsh不支持。
以上讲述了bash与tcsh的主要不同之处,所举的例子大多点到为止,但对这二者的主要区别是一个很好的总结,为掌握了其中一种shell想使用另一种的用户提供了便利,也为已经熟悉了这两种shell,仍时常弄混的用户提供了帮助。
参考文献:
[1] 邢国庆.UNIX从入门到精通(普及版)[M].北京:电子工业出版社,2006.
[2] 孟庆昌,牛欣源. Linux教程[M].2版.北京:电子工业出版社,2007.
[3] Quigley E.Linux Shell实例精解[M].吴雨浓,译.北京:中国电力出版社,2002.