歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> 不是SHELL的SHELL—TCSHSHELL編程

不是SHELL的SHELL—TCSHSHELL編程

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

Copyright © Linux教程網 All Rights Reserved