Csh的使用


在*unix系統中,常用的shell有sh,bash,csh/tcsh, ksh. 
sh來自於systemV的Unix,是傳統的Unix的shell,直到現在很多的系統管理員仍然喜歡使用sh。
bash來自於BSD Unix,語法非常類似於C語言,所以通常有C/C++編程背景的開發人員最喜歡使用。
ksh是對sh的擴展,且吸收了csh的一些有用的功能,但是由於開始ksh的license是AT&T,所以后來出現了很多的ksh的開源版本,例如mksh,pdksh等。
bash是現在很多Linux的發行版中默認的shell,綜合了其他shell的很多優點。

 

下面描述csh的一些基本的語法(在sh環境中執行csh切換到csh環境):

 

1) 變量
通過set來定義局部變量x,通過$x或${x}來使用變量x的值,$%x表示變量的值的長度, $?x來判斷變量x是否設置,如設置則為1,否則為0。
set x = 5
echo $x
echo ${x}kg
echo $%x   

 

全局變量的定義setenv v  value 該變量將被此shell派生的所有子shell繼承。

 

$$表示當前進程的PID, $status 或 $? 表示退出狀態。

 

2)數組
定義數組myarr, 通過$myarr[index]來訪問數組中的值,注意index是從1開始的。通過$myarr或$myarr[*]來訪問數組所有的元素。通過$#myarr來查看元素的個數。
set myarr = (str1, str2,str3)
echo $myarr[2]
echo $myarr
echo $myarr[*]

 

3)命令替換
通過set x = `cmd`來執行命令,且結果賦值給變量。
set d = `date`
echo $d
echo $d[6]-$d[2]-$d[3]

 

4)命令行參數
通過$argv[1],$argv[2]或$1,$2來訪問命令行參數。命令行參數的個數為$#argv。

 

5)文件名擴展的元字符
只能使用?,*,[abc],[a-c]。

 

6)IO重定向和管道
將命令的輸出重定向到文件為>。
將命令的輸出重定向並追加到文件為>>。
將命令的輸入重定向到文件為<。
將命令的報錯信息重定向到一個文件(cmd>/dev/tty)>&errors。

將命令的輸出和錯誤輸出分別重定向(cmd > goodstuff)  >& badstuff。

將命令的輸出和報錯信息重定向到一個文件cmd>&file。
將命令的輸出經管道發往另一個命令cmd|cmd.
將命令的輸出和報錯信息經管道發往另一個命令cmd|&cmd。
條件語句為 cmd && cmd 或 cmd || cmd。

command<<WORD 表示將command的輸入重定向為從第一個WORD處開始,到下一個WORD處之間的內容(即here文檔)。

 

7)從鍵盤讀取並保存到變量中
set var = $<

 

8)算術
@ var = 5 + 5
echo $var
@ v2 = $var + 3
echo $v2

 

9)代字符號擴展
~username 表示username的home目錄。

 

10)別名
alias m more 為more創建別名m。
alias 列出所有的alias。
unalias m 用來刪除more的alias定義。

 

11)初始化文件
.login 在登錄時執行的文件。
.cshrc 在每次調用shell時都執行的文件。

 

12) label 和 goto
csh中沒有函數的概念,使用類似windows批處理中的label和goto。
goto label
......
label:
....

 

13) if/else/switch/case
if(expression)then
  commands
endif

 

if {(command)} then
  commands
endif

 

if(expression) then
  commands
else if(expression) then
  commands
else
  commands
endif

 

switch("$value")
case pattern1:
  commands
  breaksw
case pattern2:
  commands
  breaksw
default:
  commands
  breaksw
endsw

 

14 while/foreach
while(expression)
  commands

  continue

  break 

end
foreach var (wordlist)
  commands
end

 

15 repeat
repeat表示重復執行后面的命令。
repeat 3 "echo helloworld"

 

16 csh中設置環境變量PATH的方法

csh中使用path代替PATH,設置類似於數組的使用。 

set path = ($path /home)

echo $path

echo $PATH 

 

17 source等價於其他shell中的.

source使得程序在當前的shell中被執行,而不是派生子進程來執行。

 

18轉義字符與單雙引號

引號必須成對出現,而且必須在同一行上配對。可以用反斜杠來轉義換行符,這樣就能在下一行配對了。
單引號可用於保護雙引號,雙引號也可以用來保護單引號。
單引號保護除歷史字符(!)之外的所有元字符不被解釋。

雙引號保護除歷史字符(!),變量替換字符($)和反引號(用於命令替換)之外的所有元字符,使其不被解釋。 

 

19 歷史command

history用來查看command執行的歷史。

!!用來執行上一條命令。 

 

20 pushd和popd用來維護目錄棧

 

21 csh -vx用來顯示輸入的原樣和變量替換后的腳本,用來幫助調試。

 

22在腳本中處理中斷

onintr finish
  <script continues here>
  
finish:
onintr - # Disable further interrupts
echo Cleaning temp files
exit 1
onintr 命令后跟一個標號名,finish是用戶自定義的標號。如果發生中斷,控制將被轉移到finish標號。通常該行位於腳本的開頭。除非當程序正在執行時按ctrl+C(中斷鍵),此時控制將被轉移到該標號。onintr - 表示屏蔽所有的中斷,此時按下ctrl+C將會被忽略。  

 

23 noclobber 禁止覆蓋變量,設定 $noclobber 預設變量改變輸出重定向特性.     

變量設定語法 set noclobber
取消變量設定語法 unset noclobber
    這個 noclobber 變量,它的功能便是停止重定向符號“>”的覆蓋(overwiting)已存在文件以及符號“>>”要將字符寫入一個不存在的文件時,自動產生該文件的特性。 
僅用兩個例子讓讀者明白,設定后的實際使用狀況。 

 

例子一:         
% ps axu > testfile
% set noclobber
% echo "test set noclobber" > testfile
testfile: File exists.
% echo "test set noclobber" >! testfile
%
例子二: 
% set noclobber
% cat /etc/passwd >> nopass
nopass: No such file or directory
% cat /etc/passwd >>! nopass
%

 

完!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM