Csh的基本文法介紹_linux shell

來源:互聯網
上載者:User

在*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
%

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.