摘要: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命令,并有兩種方法,一種使用\"$<\"(兩邊為雙引號),另一種使用`line`(兩邊為反引號),(見表3)。
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.