TCSH shell不同于其他的shell,因為控制結(jié)構(gòu)更符合程序設(shè)計語言的格式.例如
TCSH 的test條件的控制結(jié)構(gòu)是表達式,而不是linux命令,得到的值是邏輯值true
或false,TCSH的表達式與C語言中的表達式基本相同.
一,TCSH shell變量,腳本,參數(shù)
用戶可以在shell中定義變量,為變量賦值以及引用腳本參數(shù).TCSH使用set,@,setenv定
義一變量,也可以用相同的方法定義數(shù)值變量和數(shù)組,用戶通過@命令定義的數(shù)值變量來
進行算術(shù)運算,用戶使用圓括號()和方括號[]定義和引用數(shù)組.腳本也可以用相同的方
法操作,但是有個例外,盡管可以用echo命令輸出提示符,但沒有read命令處理輸入,相
反,必須重定向到一個變量里.
二,腳本輸入和腳本輸出: $ <
用戶能夠在腳本范圍中定義和使用變量.在下例中,使用文本編輯器把賦值操作和echo
之類的linux命令放在一個文件中.然后, 可以產(chǎn)生可執(zhí)行文件并像其他命令一樣在命
令行中執(zhí)行它,要記住添加可執(zhí)行權(quán)限,必須使用帶u+x參數(shù)的chmod命令或者帶絕對參
數(shù)700的chmod命令.在腳本中,可以使用echo命令去輸出數(shù)據(jù),但是,必須通過重定向標(biāo)
準輸入把輸入讀入變量.在TCSH中沒有l(wèi)inux read命令的比較版本.記住TCSH全部的腳
本文件的第一行的第一個字符必須是"#"字符.
如:
#
#display "hello"
set string="hello"
echo The value of string is $string
set命令和重定向符號結(jié)合$<將用戶輸入的任何數(shù)據(jù)讀入標(biāo)準的輸入中.下例中,把用戶
輸入讀入string變量中.
set string=$<
echo $string
abc
abc
能夠把提示符放置到相同的行用作echo的輸入.TCSH使用一個特殊的選項-n,將消除輸
出字符串中的回車符.光標(biāo)將保留在輸出字符串的結(jié)尾處.
%echo -n please enter a string
%cat hello
#
echo -n "please enter a string:"
set string=$<
echo "the value of string is $string"
%chmod u+x hello
%hello
please enter a string:hello
the value of string is hello
%
三,操作符
TCSH有一系列標(biāo)準的賦值,算術(shù)和關(guān)系運算以及重定向和后臺操作等函數(shù)
賦值運算符 功能說明
= 賦值操作
+= 先加再賦值
-= 先減再賦值
*= 先乘再賦值
/= 先除再賦值
%= 取余再賦值
++ 自增量1
-- 自減量1
算術(shù)運算符 說明
- 負號
+ 加法
- 減法
* 乘法
/ 除法
% 取余
關(guān)系運算符 說明
> 大于
< 小于
>= 大于等于
<= 小于等于
!= 不等于
== 等于
重定向和管道符
TCSH支持標(biāo)準輸入和標(biāo)準輸出的重定向和管道操作.如果設(shè)置了noclobber特征,要用
重定向操作重寫當(dāng)前文件,需要用符號>!代替>
四,控制結(jié)構(gòu)
同其他shell一樣,TCSH也有一系列的控制結(jié)構(gòu)控制腳本的命令的執(zhí)行.while和if控
制結(jié)構(gòu)是最常用的控制結(jié)構(gòu).switch和foreach是更專用的控制結(jié)構(gòu).switch是if條件
的限定形式,檢查數(shù)值是否等于一系列可能的數(shù)值中的一個數(shù)值.foreach是循環(huán)結(jié)構(gòu)
的限定形式.瀏覽數(shù)值列表,給變量賦新的數(shù)值.
TCSH不同的控制結(jié)構(gòu)列表:
條件控制結(jié)構(gòu); 功能
if (expr
commands
endif
if (expr
command1
else
command2
endif
switch (string)
case pattern:
commands
breaksw
default:
commands
endsw
循環(huán)控制結(jié)構(gòu): 功能
while (expr
commands
end
foreach variable (argument-list)
commands
end
TCSH中的控制結(jié)構(gòu)有別于其他的shell,因為它更接近編程語言(C).TCSH的條件表達
式的值為true/false.BASH和TCSH主要區(qū)別在于TCSH的結(jié)構(gòu)不可重定向或進行管道
輸出.
五,測試表達式;()
if和while控制結(jié)構(gòu)把表達式用作測試.表達式測試的結(jié)果為非零(1)表示真,而零
(0)表示假(跟BASH相反).測試表達式可由算術(shù)/字符串比較,但是字符串只能作相
等和不相等的比較.而且表達式必須要在()括號內(nèi).
如:
if (expr
command
endif
TCSH有一系列的運算符來分別對字符串進行測試比較.正則表達式可以包含shell腳本的
指令的字符串.如:
if ( $var =~[Hh]* ) then #如果變量$var以字母是大寫/小寫Hh開頭,的字符串
echo information #執(zhí)行命令
endif #結(jié)束
有很多測試文件的操作與BASH完全相同.如:
if ( -r myfile ) then #測試myfile是否可讀
echo info
endif
測試表達式的基本操作:
字符串比較: 功能
== 是否相等,若相等返回真
!= 是否不等,若不等返回真
=~ 字符串和模式進行測試是否相等(模式為任意正則表達式)
!~ 字符串和模式測試是否不等(模式為任意正則表達式)
文件測試: 功能
-e 測試文件是否存在
-r 測試文件是否可讀
-w 測試文件是否可寫
-x 測試文件是否可執(zhí)行
-d 測試文件名是否為目錄
-f 測試文件是否為普通文件
-o 測試文件是否被用戶所擁有
-z 測試文件是否為空
邏輯運算符: 功能
&& 與運算,兩個條件同時蠻族
|| 或運算,有一個條件滿足
! 取反
六,TCSH內(nèi)建命令
1,數(shù)字變量:@
在TCSH中,用@命令代替set命令來聲明數(shù)字變量,然后進行算術(shù),關(guān)系和位操作,數(shù)字和
字符串變量是兩個不同的對象,需要用不同的方法管理,不能把set用于數(shù)值變量的設(shè)置
@命令由關(guān)鍵詞,變量名,賦值運算符和表達式構(gòu)成.如:
%@ num=10 #注意空格
%@ sum=2 * ($num + 3)
%echo $sum
%26
2,alias
格式:alias [name[command]]
關(guān)鍵詞alias 別名name 引用的命令command
如:
alias list ls
alias list 'ls -l'
3,argv
當(dāng)腳本被執(zhí)行時,命令行中的單詞被分析并放入argv數(shù)組中.argv[0],argv[1]...
argv[n],其中argv[0]保存命令名,argv[1]保存命令的第一個參數(shù),argv[n]命令的
第n個參數(shù).argv數(shù)組元素可縮寫元素號碼,前面加$.如:$argv[1]寫為$1.$argv
寫為$*.#argv參數(shù)標(biāo)識符包含輸入在命令行中的參數(shù)號碼,可檢查$#argv變量.如:
arglist
#
echo "The number of arguments entered is $#argv"
echo "The list of arguments is : $argv
"
%tcsh arglist a b c
The number of arguments entered is 3
The list of arguments is : a b c
argv變量列表:
命令行參數(shù) 說明
$argv[0]或$0 命令名
$argv[n]或$n 從1($1-$)開始的第n個命令行參數(shù)
$argv
或$* 從1開始的所有命令行參數(shù)
$#argv或$# 命令行參數(shù)的計數(shù)
4,bg
格式:bg [%job]
bg命令把指定的任務(wù)放入后臺.如果此任務(wù)已經(jīng)停止,則繼續(xù)執(zhí)行,如果沒有參數(shù),將
當(dāng)前任務(wù)放入后臺.(詳細用法與BASH相同此處略)
5,break
格式:break
break命令用于退出最接近的foreach/while循環(huán)過程.執(zhí)行同一行中其他的命令.
6,breaksw
格式:breaksw
可以從switch語句處中斷,在endsw后繼續(xù)執(zhí)行.
7,builtins
列出全部shell的內(nèi)建命令表.
8,cd
格式:cd [-p][-l][-nl -v][name]
如果給出目錄名,此命令把name設(shè)置為當(dāng)前目錄,如果命令中沒有name,當(dāng)前目錄自動
設(shè)置成用戶主目錄.用于name的"-"引用上一級目錄,如果參數(shù)name沒有給出子目錄,
或不是全路徑,或使用./或../引用當(dāng)前目錄及父目錄,那么就檢查在cdpath shell變量
中列出的目錄來尋找該目錄名.如果此操作失敗,將檢查shell變量中是否保存著的目錄
路徑名.
用-p選項,linux顯示目錄列表, 用-l,-n,-v選項與用在dirs命令中的選項完全相同.
默認選項-p.
9,continue
此命令繼續(xù)執(zhí)行最靠近while/foreach語句.當(dāng)前行其余的命令被執(zhí)行.
10,dirs
格式:dirs [-l][-n|-v]
dirs -S|-L [filename]
dir -c
如果不帶參數(shù),dirs將顯示目錄列表,列表開頭被列在作側(cè),第一個目錄是當(dāng)前目錄.
帶-l選項,用戶主目錄中的全部子目錄被展開,輸入項在到達屏幕邊緣時,-n選項隱藏
輸入項,-v選項顯示每一行的輸入項入口,-c選項將清除目錄列表,-S選項可以把目錄
列表作為一系列的cd和pushed命令保存在文件中,-L選項可以從指定的文件中將cd
和pushed命令讀入,該文件包含-S選項所存儲的cd和pushed命令.如果沒有指定的文件
名,將使用賦值到dirsfile shell變量中的文件名.如果沒有設(shè)置dirsfile,將使用
~/.cshdirs,在啟動時注冊shell將對dirs -L求值,如果設(shè)置了savedirs,退出前使用
dirs -S,由于在~/.cshdirs之前,僅僅~/.tcshrc是正常來源,dirsfile應(yīng)該以~/.tcshrc
設(shè)置而不是以~/.login設(shè)置.
11,echo
格式:echo [-n] word/string
此命令把每個單詞或字符串寫入shell的標(biāo)準輸出.可設(shè)置echostyle shell變量來仿真
選項以及BSD的換碼序列或者echo的System V 版本.
12,ev
格式:ev
此命令把參數(shù)作為shell的輸入,執(zhí)行當(dāng)前shell的上下文中的結(jié)果命令,由于分析發(fā)聲
在替換前,所以該命令通常用于執(zhí)行命令或變量替代所產(chǎn)生的命令.
13,exec
格式:exec command
此命令代替當(dāng)前的shell執(zhí)行指定的命令,并退出終端.
14,exit
格式: exit [expr
shell可以帶指定的表達式的值退出,如果沒有包含表達式,也可帶狀態(tài)變量值退出.
15,fg
格式:fg [%job...]
把指定的任務(wù)帶到前臺,如果任務(wù)在終止?fàn)顟B(tài),在帶到前臺的同時使他運行.
job參數(shù)是使用任務(wù)號或者下列字符串之一的任務(wù)引用:' % + -
16,foreach
格式:foreach variable(list of values)
commands
end
foreach結(jié)構(gòu)被設(shè)置為順序引用數(shù)值列表,它類似BASH shell的for in 結(jié)構(gòu).foreach
結(jié)構(gòu)產(chǎn)生兩個操作數(shù):一個變量和一組包含在()中的數(shù)值列表.將列表中的值賦值到
結(jié)構(gòu)中的變量中.循環(huán)體的結(jié)尾由語句end構(gòu)成.下例中腳本list輸出由項目和foreach
循環(huán)讀取每一項當(dāng)前的日期構(gòu)成的一行信息,列表中的每一項被連續(xù)賦值到變量object
list
#
set tdate=`date +%D`
foreach object(milk cookies apples cheese)
echo $object $tdate
end
%tcsh list
milk 04/26/03
cookies 04/26/03
apples 04/26/03
cheese 04/26/03
使用foreach循環(huán)有助于管理文件,可以模式中的shell特定字符來產(chǎn)生用作數(shù)值列表
的文件名列表,然后所產(chǎn)生的文件名列表就成為foreach結(jié)構(gòu)引用的列表.如果在列表
中不帶任何變量,可以使用命令行參數(shù)實現(xiàn)循環(huán).
list
#set tdate=`date +D%`
foreach object($argv
)
echo "$object $tdate"
end
%tcsh list a b c
a 04/26/03
b 04/26/03
c 04/26/03
使用argv
特殊參數(shù)變量,可以直接引用命令行參數(shù).下例中,當(dāng)調(diào)用shell腳本
cbackuparg時,在命令行下輸入C程序文件的列表,在foreach循環(huán)中,argv
引用
命令行中的所有參數(shù),將按順序把各個參數(shù)賦值給變量backfile,變量argnum用于
引用每個參數(shù).顯示參數(shù)和backfile的值來說明它們兩個是相同的.
源碼:--------------------------------------------------------------------------------cbackuparg
#
@ argnum=1
foreach backfile ($argv
)
cp $backfile sourcebak/$backfile
echo "$backfile $argv[$argnum]"
@ argnum=$argnum+1
end
--------------------------------------------------------------------------------
%cbackuparg main.c lib.c io.c
main.c main.c
lib.c lib.c
io.c io.c
17,history
格式:
history [-hr][n]
history -S|-L|M [filename]
history -c
如果history沒有任何參數(shù),將顯示開行號的歷史命令列表.用作參數(shù)的號碼將列出
行的最后號碼.如果沒有任何選項參數(shù),她將用作歷史文件名;否則,將使用hisfile
變量值.
用-h選項,將以注釋的形式顯示不帶行號的歷史文件列表
用-r選項,將反向顯示,以最近的列表開始
用-c選項,則清除歷史列表
如果用-S選項,可以把歷史列表存入文件,如果savehist shell變量的第一個單詞
被設(shè)置為數(shù)值,歷史文件將被保存為最大的行數(shù),如果第二單詞為'merge',歷史列表
將被合并到當(dāng)前的歷史文件中,而不替代歷史列表,時間圖章排序歷史列表.
如果用-L選項,shell將從存儲的歷史列表文件中讀取歷史列表并把她追加到當(dāng)前
歷史列表中.
如果用-M選項,將從歷史文件讀取歷史列表信息,但用當(dāng)前歷史列表信息合并,排序
歷史列表.
如果沒有用這些選項給出文件名,那么,就使用賦值到histfile shell變量的文件
名,如果沒有設(shè)置histfile,就使用~/.history.
18,hup
格式:
hup [command]
如果帶有括起來的command參數(shù),hup運行command,根據(jù)停機信號退出.當(dāng)shell退出時,
hup安排shell發(fā)出停機信號.注意:命令也許設(shè)置自己的停機響應(yīng),重寫hup,如果沒有
參數(shù)(只有在shell腳本中才允許),hup使shell根據(jù)腳本的余項的停機信號退出.
19,if-then
格式:
if (expr
command
endif
if-then結(jié)構(gòu)把條件放入幾個linux命令,該條件是expr
非零的數(shù)值,那么expr
那么expr
if-then結(jié)構(gòu)以if關(guān)鍵詞開始,expr
任意數(shù)量的linux命令,以關(guān)鍵詞endif結(jié)束if命令.注意:在TCSH中,if (expressiong)
和then必須在同一行!
舉例:
源碼:--------------------------------------------------------------------------------
ifls
#
echo -n "Please enter option:"
set option=$<
if ($option=="s") then
echo List files by size
ls -s
endif
--------------------------------------------------------------------------------
%tcsh ifls
Please enter option: S
List files by size
total 2
1 monday 2 today
%
20,if-then-else
格式:
if (expressiong) then
command
else
command
endif
用戶需要經(jīng)常需要根據(jù)expr
在兩者之間選擇,如果expr
就是else后面的command.
舉例:
源碼:--------------------------------------------------------------------------------
elsels
#
echo Enter s to list file sizes
echo otherwise all file information is listed
echo -n "please enter option:"
set option=$<
if ($option=="s") then
ls -s
else
ls -l
endif
echo Good-bey
--------------------------------------------------------------------------------
(結(jié)果略)
21,jobs
格式:
jobs [-l]
此命令列出所有活動的任務(wù),如果帶-l選項,將列出進程號,以及正常的信息.
22,kill
格式:
kill [-signal] %job\pid...
kill -l
此命令用于終止進程或者任務(wù),如果帶-signal選項,應(yīng)該指定要發(fā)送的信號,默認發(fā)送
的信號是SIGTERM,如果帶有-l選項,則列出信號名,對于帶-l選項提供的信號數(shù),將
列出與其相關(guān)的信號名.
23,logout
此命令用于終止注冊shell,如果設(shè)置了ignoreeof,它將非常有用.
24,nice
格式:
nice [+ number][command]
此命令設(shè)置shell調(diào)整優(yōu)先為number,如果沒有設(shè)置number,調(diào)整優(yōu)先設(shè)置為4,帶有
指定的command,nice適當(dāng)?shù)膬?yōu)先運行command,number值越大,進程獲得的CPU的時間
就越少.
25,nohup
格式:
nohup [command]
如果不帶command參數(shù),nohup指示shell忽略任何停機信號,如果帶command參數(shù),將
執(zhí)行此命令并忽略執(zhí)行中的任何停機信號.
26,notify
格式:notify [%job...]
Linux執(zhí)行命令后,如果有后臺任務(wù)在執(zhí)行,系統(tǒng)將通知到目前為止已經(jīng)完成的后臺
任務(wù),該系統(tǒng)不會中斷如編輯這樣的操作來通知用戶關(guān)于完成的任務(wù),當(dāng)某任務(wù)完成
時,如果想馬上知道,無論系統(tǒng)在作什么,可以使用notify命令指令系統(tǒng)通知用戶,它的
參數(shù)作為任務(wù)號,當(dāng)任務(wù)完成時,系統(tǒng)將中斷當(dāng)前命令并通知用戶任務(wù)已經(jīng)完成,如:
%notify %2
當(dāng)2號任務(wù)完成時,告訴系統(tǒng)通知用戶.
27,on
格式 on
此命令控制shell在中斷時的動作,不帶任何參數(shù),將回復(fù)shell中斷默認的動作,將
終止shell腳本或返回輸入級的終止符,如果帶-參數(shù),則忽略全部的中斷,當(dāng)接受中斷
或當(dāng)子進程終止時,帶label的命令將使shell執(zhí)行g(shù)oto標(biāo)號.
28.popd
格式 popd [-p][-l][-n|-v][+n]
此命令從目錄列表中刪除一個目錄,不帶參數(shù)的命令從列表中刪除頂層目錄,+n刪除
從左起的第n層的目錄.然后popd顯示最終的目錄列表.pushdsilent shell變量可以
設(shè)置為支持此特性,-p選項可以重寫pushdsilent.
29.printenv
格式:
printenv [name]
此命令顯示環(huán)境變量的名和值,如果帶name參數(shù),僅僅顯示環(huán)境變量name的值.
30.pushd
格式:
pushd [-p][-l][-n|-v][name|+n]
此命令把目錄添加到存儲的目錄列表中,然后顯示目錄列表,如不帶參數(shù),除非目錄
為空,pushd交換頂層的兩個目錄,并返回0.
+n旋轉(zhuǎn)列表以便使第n個目錄(從左起)列與頂端,但是,如果設(shè)置了dextract,pushd +n
將展開第n個目錄,把它壓入堆棧頂層.
-n旋轉(zhuǎn)堆棧以便第n個目錄(從右起)列于頂端,dir把dir添加到頂端的目錄列表,是她
成為新的當(dāng)前目錄.如果設(shè)置了pushtohome,不帶參數(shù)的pushd命令執(zhí)行pushd ~的
功能,像cd的功能一樣,如果dunique被設(shè)置,pushd在壓入堆棧之前從堆棧中刪除任何
的name歷程,可以設(shè)置pushdsilent shell變量來取消目錄列表的顯示,然后可以使用
-p選項重寫pushdsilent.
31,repeat
格式:
repeat count command
此命令重復(fù)執(zhí)行command指定的次數(shù)count.
32,set
格式:
set
set name ...
set name = value ...
set name = (wordlist)...
set name[index] = word ...
set -r
set -r name ...
set -r name = value ...
set -r name = (wordlist) ...
不帶任何參數(shù)的set命令將顯示全部的shell變量值,包含許多單詞的變量作為放在
括號中的詞列出,帶name參數(shù)的set命令定義一個變量并為它賦值null串,帶有name
和=符號分隔的值,set定義變量并給它賦值,要把wordlist作為值賦值給name變量,
把列表中的詞作為要賦的值放在括號中,為了將數(shù)值賦值給數(shù)組元素,,使用方括號
[]指定元素的index,但是該元素必須已經(jīng)存在.
-r選項常用于引用只讀變量,僅僅帶-r選項的set命令將列出只讀變量,與變量名一起
使用,set將使此變量設(shè)置為只讀,與賦值的變量一起使用,將初始化該變量,并使該
變量成為不能被修改的只讀變量.
在TCSH中,用戶必須在使用變量之前首先聲明它,使用加變量名的set命令聲明變量.
變量名可以是任何字母字符包括下劃線_,也可以含有數(shù)字,但是變量名不能以數(shù)字為
首字符!
33,setenv
格式:
setenv [name[value]]
setenv常用于定義有特定值的環(huán)境變量.如沒有帶value選項,setenv設(shè)置name變量
為null串,如果沒有帶任何參數(shù),將顯示全部環(huán)境變量的名稱和值.
TCSH有兩種類型的變量:局部變量和環(huán)境變量.局域變量是在shell內(nèi)部聲明的;環(huán)境
變量是全局域的變量.使用setenv可以定義環(huán)境變量,使用setenv命令,變量名,以及
被賦值的值,就可給環(huán)境變量賦值.其中,沒有賦值運算符,如:
%setenv greeting hello
greeting環(huán)境變量被賦值為hello
無論何時調(diào)用shell腳本,都將產(chǎn)生自己的shell,如果shell腳本被另外一個shell腳本
執(zhí)行,它將使自己的shell從第一腳本的shell中分離.現(xiàn)在有兩個shell,屬于第一個
腳本的父shell和當(dāng)執(zhí)行第二個腳本是產(chǎn)生的子shell.在其他的shell內(nèi)部執(zhí)行腳本
時,這個shell是第一個腳本的子shell,原來的腳本的shell是它的父shell.
每個shell都擁有自己的變量,子shell不能引用父shell中的局域變量,但是能引用
環(huán)境變量.子shell可以引用父shell中聲明的任何環(huán)境變量.
34,shift
格式:
shift [variable]
沒有參數(shù)的shift命令向左移動argv數(shù)值,即argv[1]的數(shù)值被argv[2]所代替,如果
argv沒有被設(shè)置或者數(shù)值少于一個詞時將發(fā)聲錯誤.帶有其數(shù)值為列表或數(shù)組的
variable,該命令將列表和數(shù)組的數(shù)值向左移動.
35,source
格式:
source [-h] name [argument...]
source讀出并執(zhí)行以name命名的命令,通常是shell腳本(不能把這些命令放在歷史
列表中).把任何參數(shù)輸入argv中.用-h選項,命令被放入歷史列表但是不立即執(zhí)行.
36.stop
格式:
stop %job\ job...
stop命令停止指定的任務(wù)或在后臺執(zhí)行的進程.也可以用一個數(shù)字或字符串引用一個
任務(wù),如果不存在默認的任務(wù),那么僅僅stop不能停止當(dāng)前的任務(wù).
37,switch
格式;
源碼:--------------------------------------------------------------------------------
switch (test-string)
case pattern:
commands
breaksw
case pattern:
commands
breaksw
default:
commands
breaksw
endsw
--------------------------------------------------------------------------------
switch結(jié)構(gòu)在幾個可能的選項中進行選擇.此結(jié)構(gòu)與BASH中的case結(jié)構(gòu)非常類似
通過把字符串與幾個可能的模式進行選擇,每個可能的模式都與一系列命令相關(guān)
聯(lián),如果沒有相匹配的項,則執(zhí)行相關(guān)的命令,.switch結(jié)構(gòu)以關(guān)鍵詞switch和放在
圓括號中的test-string開始,字符串常由變量求值導(dǎo)出,然后是一系列的模式,每個
模式pattern前是關(guān)鍵詞case,以冒號:結(jié)束,冒號后列出與選擇有關(guān)的commands,以
breaksw終止command,在所有被列出的模式之后,關(guān)鍵詞endsw結(jié)束switch結(jié)構(gòu),注意,
每個測試表達式的命令組的最后一個命令是breaksw,每個測試表達式被逐一測試,
直到找到相匹配的內(nèi)容,如果沒有找到相匹配的項,則執(zhí)行默認項default.用關(guān)鍵詞
default表示默認選擇,default項是可選的.但是它有助于通知用戶沒有匹配的測試
字符串.舉例:
源碼:--------------------------------------------------------------------------------
lschoice
#
echo s.List sizes
echo l.List files infomation
echo c.List C files
echo -n "Please enter choice:"
set choice=$<
switch ($choice)
case s:
ls -s
breaksw
case l:
ls -l
breaksw
case c:
ls *.c
breaksw
default:
echo Invalid Option
breaksw
endsw--------------------------------------------------------------------------------
(輸出略)
38,time
格式:
time [command]
如果沒有參數(shù),此命令顯示當(dāng)前shell的時間累計,用一條命令作為參數(shù),它執(zhí)行命令
并顯示時間累計.
39,umask
格式:
umask [value]
此命令指定用戶文件建立掩碼,掩碼用八進制表示.
40,unalias
格式:
unalias pattern
此命令刪除其名稱與pattern匹配的所有別名.
41,unset
格式:unset pattern
此命令取消定義shell變量,名稱可能是匹配了幾個變量的pattern(盡量避免用
unset *,因為它將取消所有的變量)
42,unsetenv
格式:
unsetenv pattern
此命令取消定義環(huán)境變量,名稱可能是匹配幾個變量的pattern,也盡量避免用
unsetenv *,因為它將刪除所有的環(huán)境變量.
43,wait
此命令指示shell等待全部的后臺任務(wù)的完成,在一個交互的shell環(huán)境中,可中斷
一個wait操作,并顯示剩余的任務(wù).
44,where
格式:where command
此命令報告所有已知的命令歷程,包括別名,內(nèi)建和可執(zhí)行的路徑.
45,which
格式:
which command
此命令顯示shell要執(zhí)行的指定的任務(wù).
46,while
格式:
while(expr
command
end
此循環(huán)重復(fù)執(zhí)行命令,以關(guān)鍵詞while開始,接著是圓括號括起來的表達式expr
以end結(jié)束循環(huán).
while循環(huán)很容易與switch結(jié)構(gòu)結(jié)合,構(gòu)成菜單的驅(qū)動程序.舉例:
源碼:--------------------------------------------------------------------------------lschoicesw
#
set again=yes
while ($again==yes)
echo "1.List sizes"
echo "2.List files information"
echo "3.List C files"
echo "4.Quit"
echo -n "Please enter choice:"
set choice=$<
switch ($choice)
case 1:
ls -s
breaksw
case 2:
ls -l
breaksw
case 3:
ls *.c
breaksw
case 4:
set again=no
echo good-bey
breaksw
default:
echo Invalid Option
endsw--------------------------------------------------------------------------------
(輸出略)
TCSH配置
TCSHshell可以使用戶使用shell配置變量和特征配置自己的shell.也可以使用set
命令設(shè)置特征.TCSH也有注冊,注消以及何時進入TCSHshell的配置文件.
一,TCSH shell 特征
TCSH有幾個特征,允許控制不同的shell操作的方法.TCSH shell特征不僅包括許多它
自己的特征,而且還包括KSH/BASH shell中的特征,如,TCSH中有一個noclobber,
防止重定向重寫文件,,一些更常用的特征為:echo,noclobber,ignoreeof和noglob.
通過定義和取消定義與該特性相關(guān)的變量,打開/關(guān)閉TCSH shell特征,為每個特征命名
變量.例如,通過定義noclobber變量,打開noclobber特征.使用set命令定義變量,而
使用unset命令取消定義變量.為了運行noclobber特征,使用set noclobber,為了關(guān)
閉它,使用unset noclobber.如:
set variable 定義變量
unset variable 取消變量
由于這些變量常用于打開/關(guān)閉特征,所以有時也被叫做雙態(tài)切換.
1,echo
在echo被執(zhí)行之前,設(shè)置echo啟動顯示命令的特征.
set echo 打開echo特征
unset echo 關(guān)閉echo特征
2,ignoreeof
設(shè)置ignoreeof啟動防止用戶使用CTRL+D注消用戶shell的特征,它用于防止突發(fā)性
的注消操作,如果此特征關(guān)閉,可以用CTRL+D注消過程.由于在標(biāo)準輸入中CTRL+D是
結(jié)束用戶輸入的操作,所以很容易造成突發(fā)注消shell進程.因此,ignoreeof特征就
能防止這種突發(fā)的注消,當(dāng)此特征被設(shè)置后,用戶必須用logout命令明確注消.
3,noclobber
設(shè)置noclobber啟動預(yù)防現(xiàn)有文件不被重定向輸出的特征,借助此特征,如果把輸出
重定向到已經(jīng)存在的文件中,就不用標(biāo)準的輸出重寫文件.原文件被保存.也許會發(fā)
生這種情況:把現(xiàn)有文件名用作保存被重定向的輸入的文件名.因此,noclobber特征
使用戶不會意外的重寫原文件.
%set noclobber
%cat oldfile > newfile
newfile: file exist
有時,用戶想用重定向輸出重寫某個文件,那么就可在重定向符號操作符之后放置
驚嘆號!實現(xiàn)重寫操作.這將重寫noclobber特性,用標(biāo)準的輸出代替文件內(nèi)容.
%cat oldfile >!newfile
4,noglob
設(shè)置noglob使某特性有效,該特征禁止用戶shell中的某些字符.字符 * ? [ ] ~將
不再擴展為匹配的文件名.如:
%set noglob
%ls myfile?*
myfile?*
附錄:常用的TCSH shell特征:
特征 功能
set 打開shell特征
unset 關(guān)閉shell特征
echo 執(zhí)行命令前顯示該命令
ignoreeof 禁止用CTRL+D注消
noclobber 不必通過重新定向重寫文件
noglob 禁止特殊字符用于文件名擴展:* ? ~ [ ]
notify 當(dāng)完成后臺任務(wù)時立即通知用戶
verbose 歷史命令引用后顯示命令
二,TCSH shell 變量
正如在BASH shell中一樣,也可在TCSH shell中使用特殊shell變量來匹配自己的系統(tǒng).
一些變量在系統(tǒng)初始化中定義,也可以在shell中用新的值重新定義變量,有些必須在
系統(tǒng)初始化時定義,如最常用的特殊變量prompt變量,它允許建立自己的命令行提示符
另外一個是history變量,該變量確定保存了多少歷史命令/事件. 在TCSH shell中,許
多特殊變量的名稱與函數(shù)都與BASH/ZSH shell中的變量名稱和函數(shù)類似.一些必須用
大寫表示,但是大多數(shù)用小寫表示.某些特殊變量起類似的作用,但是具有完全不同的
實現(xiàn)方法,如mail變量保存的信息與BASH shell的MAIL,MAILPATH,MAILCHECK變量保存
的信息完全相同.
1,prompt prompt2 prompt3
這三個變量為命令行保存提示符.用戶可以設(shè)置自己想要的符號/字符串作為提示符.
為了設(shè)置命令行提示符,可以用
%set prompt="+"
+
這樣提示符就變成了+號.也可以使用預(yù)定義的一組代碼使得配置提示符更容易,在每個
代碼前加個%號,例如,用%/表示當(dāng)前的工作目錄,%t表示時間,%n表示用戶名,%!表示
下一個歷史事件的號碼,如:
%set prompt="%/"
/home/dirname
代碼列表:
代碼 說明
%/ 當(dāng)前運行目錄
%h,%!,! 當(dāng)前歷史號碼
%t 當(dāng)天時間
%n 用戶名稱
%d 日期
%w 當(dāng)前月份
%y 當(dāng)前年份
當(dāng)命令分為若干行輸入時,變量prompt2被用于特殊情況,為需要輸入改命令而增加的
行顯示prompt2,prompt3提示符用于檢查拼寫特征是否被激活.
2,cdpath
cdpath變量保持目錄的路徑名,用cd搜索特定的子目錄,這些路徑名形成一個數(shù)組,就
像賦值給TCSH shell的path變量的路徑名數(shù)組一樣,注意在路徑名之間要求有空格.
%set cdpath=(/usr/bin /var/bin /home/username)
3,history和savehist
正如前面了解的那樣,history變量常用于確定要保存的歷史事件的數(shù)量,只需給該變量
賦值history應(yīng)該記錄的事件的最大的數(shù)值.當(dāng)達到最大值時,計數(shù)器從1開始.但是當(dāng)
注消時,savehist變量保存存儲在.history文件中事件的數(shù)量,當(dāng)再次注冊時,這些事件
就成為初始化歷史事件.如:
%set history=20
%set savehist=5
當(dāng)注冊時,歷史列表中將記錄20個事件,但是當(dāng)注消后,僅僅最后5個事件被保存在
.history文件中,下一次注冊時,歷史列表將由以前的最后5個命令組成.
4,mail
在TCSH shell中,mail變量綜合了BASH和ZSH shell中的MAIL,MAILCHECK,MAILPATH
變量的特征.TCSH shell mail變量值是一個數(shù)組,該數(shù)組的元素既包括檢查電子郵件
的時間間隔,又包括檢查電子郵箱文件的路徑.要給這些元素賦值,可以把賦值的數(shù)組
賦值給mail變量,用圓括號括起來,空格分割的一系列指定數(shù)組的新值.第一個值是再次
檢查電子郵件前設(shè)置等待的秒數(shù),它類似BASH shell的MAILCHECK變量保存的數(shù)組.其余
的值由電子郵箱文件的路徑構(gòu)成,檢查該文件獲取郵件.注意,這些變量保存了BASH
和ZSH shell MAIL,MAILPATH變量的功能. 如:
%set mail ( 1200 /usr/mail/user)
mail變量被設(shè)置成每1200秒檢查一次電子郵件,被檢查的電子郵箱文件在/usr/mail/user
目錄中.
%set mail (1200 /usr/mail/user /home/userdir)
也可以容易的給mail數(shù)組添加更多的郵箱文件路徑,注意每個元素之間的空格.
附常用的TCSH shell配置變量:
變量 說明
home 用戶主目錄的路徑名
user 注冊名
pwd 當(dāng)前運行目錄的路徑名
shell 用于注冊過程的程序路徑名
prompt 主提示符
path 目錄路徑名列表,搜尋目錄獲取可執(zhí)行命令
mail mail實用程序檢查該變量來獲取接受信息的郵件文件名
cdpath cd命令搜索該變量獲取子目錄的目錄路徑名
history 歷史列表中命令數(shù)量
savehist 為下一個注冊存儲歷史列表中的命令數(shù)量
EXINIT EX/vi編輯器的初始化命令
TERM 終端名
三,TCSH shell初始化文件
TCSH shell有3個初始化文件: .login .tcshrc .logout,.login文件是每次注冊時
執(zhí)行的注冊初始化文件, .tcshrc文件是每次進入TCSH shell時執(zhí)行的shell初始化
文件, 該文件在注冊時執(zhí)行或者用tcsh命令直接從另一個shell進入TCSH shell時
執(zhí)行,每次注消時執(zhí)行.logout文件
1, .login
TCSH shell有自己注冊初始化login,該文件用于配置用戶shell的shell命令和特殊
變量定義, .login文件相當(dāng)于BASH和ZSH shell中使用的.pro
.login文件包含setenv命令,給TERM之類的特殊環(huán)境變量賦值,可以用任何標(biāo)準的編
輯器編輯它,改變這些值,也可添加新的值.但是要記住:在TCSH shell中,為環(huán)境變量
賦值的命令是setenv,如:
%setenv EXINIT 'set nu ai'
定義EXINIT變量并設(shè)置vi編輯器行計數(shù)和自動縮排的功能.
當(dāng)編輯.login文件時要十分小心,不經(jīng)意的編輯可能造成錯誤的變量設(shè)置或者根本沒有
設(shè)置變量,因此,編輯之前最好備份.login文件.如果更改了.login文件,想讓這些變化
在當(dāng)前注冊期間生效,需要使用source命令重新執(zhí)行該文件,source命令實際上可執(zhí)行
任何初始化文件,其中包括.tcshrc文件和.logout文件,如:
%source .login
2, .tcshrc
每當(dāng)進入TCSH shell或產(chǎn)生任何子shell時,就執(zhí)行.tcshrc初始化文件,如果TCSH
shell是用戶注冊的shell,那么當(dāng)用戶注冊時, .tcshrc文件和.login文件一起運行,
如果從另外一個shell進入TCSH shell, .tcshrc文件被自動執(zhí)行,文件中包含的變量
和別名被定義.
實際上,每當(dāng)產(chǎn)生一個shell時,如運行shell腳本,就執(zhí)行.tcshrc文件,也就是說,每
當(dāng)創(chuàng)建一個shell時,就執(zhí)行.tcshrc文件,這允許在.tcshrc中定義局部變量,在某種
意義上說,局部變量可以進入任何子shell,即時像history這樣的用戶定義的變量也
是局部變量,但要為每個產(chǎn)生的子shell定義特殊變量,這樣,為每個子shell變量設(shè)置
history,但是,每個子shell都有自己的局部history變量,用戶甚至可在不影響其他
子shell的變量的情況下改變一個子shell的局部history變量,在shell初始化文件
中定義特殊變量可以看做是BASH shell導(dǎo)出變量,在BASH shell和ZSH shell中的導(dǎo)出
變量只把自己的拷貝傳送給子shell,改變拷貝不會影響原始定義.
.tchsrc文件也可包含別名變量和用于打開shell特征的特征變量,別名變量和特征
變量是局部變量,限定于shell內(nèi)部.但是.tcshrc文件在每個shell中都將定義這些
變量.因此, .tcshrc文件通常保存各種命令定義的別名,如:
.tcshrc
#
set shell=/usr/bin/csh
set path=$PATH (/bin /usr/bin .)
set cdpath=(/home/dirname/filename /home/dirname/files)
set prompt="!$pwd>"
set history=20
set ignoreeof
set noclobber
alias rm 'rm -i'
alias mv 'mv -i'
alias cp 'cp -i'
與環(huán)境變量不同,局部變量用set命令定義,在.tcshrc文件中的局部變量應(yīng)該使用
set命令定義,用setenv命令定義的環(huán)境變量是放在.login文件中的,請記住:當(dāng)改變
path或cdpath的路徑名時,數(shù)組中包含這些路徑名,數(shù)組中的每個元素要用空格分開,
如果添加新的路徑名時,必須保證用空格把它和其他的路徑名分開.如果已經(jīng)改變了
.tcshrc文件,希望這些變化在當(dāng)前注冊中立即生效,別忘了用source命令重復(fù)執(zhí)行
.tcshrc文件.
3, .logout
.logout文件也是初始化文件,只不過它在注消時執(zhí)行,用戶可以設(shè)置.logout文件以使
其完成任何在注消時想要完成的操作,文件中沒有定義變量,常包括關(guān)閉進程的shell
命令.可以向.logout文件中添加自己的shell命令,如:
.logout
#
clear
echo "Good-bey..."