無線&移動互聯網技術研發

          換位思考·····
          posts - 19, comments - 53, trackbacks - 0, articles - 283
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          shell函數

          Posted on 2009-11-29 12:09 Gavin.lee 閱讀(385) 評論(0)  編輯  收藏 所屬分類: Linux shell 入門

           

          函數由兩部分組成:
          • 函數標題。
          • 函數體。

          標題是函數名。函數體是函數內的命令集合。標題名應該唯一;如果不是,將會混淆結,因為腳本在查看調用腳本前將首先搜索函數調用相應的 s h e l l。
          定義函數的格式為:
          Shell代碼
          1. 函數名()   
          2. {    
          3. 命令1  
          4. . . .   
          5. }   
          6. 或者   
          7. function 函數名()   
          8. {   ...   
          9. }  


          兩者方式都可行。如果愿意,可在函數名前加上關鍵字function,這取決于使用者。

          創建函數文件
          下面創建包容函數的函數文件并將之載入shell,進行測試,再做改動,之后再重新載入。
          函數文件名為functions.main,內容如下
          Shell代碼
          1. #!/bin/sh   
          2. #functions.main   
          3. #   
          4. #findit: this is front end for the basic find command   
          5. findit() {   
          6. #findit   
          7. if [ $# -lt 1 ]; then   
          8. echo "usage : findit file"  
          9. return 1;   
          10. fi   
          11. find . -name $1 -print   
          12. }  
          定位文件
          定位文件格式為:
          . /pahname/filename
          現在文件已經創建好了,要將之載入shell,試鍵入:
          $. functions.main
          如果返回信息file not found,再試:
          $. /functions.main
          此即<點> <空格> <斜線> <文件名>,現在文件應該已載入shell。如果仍有錯誤,則應該仔細檢查是否鍵入了完整路徑名

          檢查載入函數
          使用set命令確保函數已載入。set命令將在shell中顯示所有的載入函數。
          Shell代碼
          1. /home/l/g/tomotoboy/function >. function.main   
          2. /home/l/g/tomotoboy/function >set   
          3. ……   
          4. _=function.main   
          5. findit ()   
          6. {   
          7.     if [ $# -lt 1 ]; then   
          8.         echo "usage : findit file";   
          9.         return 1;   
          10.     fi;   
          11.     find . -name $1 -print   
          12. }  
          執行shell函數
          要執行函數,簡單地鍵入函數名即可。這里是帶有一個參數的 findit函數,參數是某個文件
          Shell代碼
          1. /home/l/g/tomotoboy/function >cd .   
          2. /home/l/g/tomotoboy/function >cd ..   
          3. /home/l/g/tomotoboy >findit sed.txt   
          4. ./testdirec/sed.txt   
          5. ./sed.txt  


          刪除shell函數
          現在對函數做一些改動。首先刪除函數,使其對shell不可利用。使用unset命令完成此功能。刪除函數時unset命令格式為:
          unset  function_name
          $unset findit
          如果現在鍵入set命令,函數將不再顯示。
          Shell代碼
          1. /home/l/g/tomotoboy >unset findit   
          2. /home/l/g/tomotoboy >set   
          3. ……   
          4. _=findit   
          5. /home/l/g/tomotoboy >findit sed.txt   
          6. -bash: findit: command not found  


          再次定位函數
          Shell代碼
          1. /home/l/g/tomotoboy >. function/function.main   
          2. /home/l/g/tomotoboy >findit sed.txt   
          3. ./testdirec/sed.txt   
          4. ./sed.txt  

          如果函數將從測試結果中反饋輸出,那么使用替換命令可保存結果。函數調用的替換格式為:
          variable_name = variable_name
          函數function_name輸出被設置到變量variable_name中。
          Shell代碼
          1. char_name(){   
          2. # char_name   
          3. # to call: char_name string   
          4. # assign the argument across to new variable   
          5. _LETTER_ONLY=$1  
          6. # user awk to test for character only!   
          7. _LETTER_ONLY=`echo $1|awk '{if ($0~/[^a-z A-Z]/) print 1}'`   
          8. if [ "$_LETTER_ONLY" != "" ]   
          9. then   
          10.     # oops  errors   
          11.     return 1  
          12. else   
          13.     # constains only chars   
          14.     return 0  
          15. fi   
          16. }  

          Shell代碼
          1. if char_name $F_NAME; then   
          2.  echo "OK"  
          3. else   
          4.   echo "ERROR"  
          5. fi  
          測試一下
          Shell代碼
          1. /home/l/g/tomotoboy/function >char_name hello   
          2. /home/l/g/tomotoboy/function >echo $?   
          3. 0  
          注意^符號的使用,當直接用在第一個括號里,意指否定或不匹配括號里內容。[^a-z A-Z] 匹配任一非字母型字符,而[^0-9]匹配任一非數字型字符。
          主站蜘蛛池模板: 甘孜县| 正阳县| 江陵县| 思南县| 邯郸县| 彭州市| 汤阴县| 改则县| 竹北市| 灌云县| 城口县| 盐边县| 石棉县| 江达县| 施甸县| 临澧县| 平乐县| 罗山县| 临安市| 平罗县| 亚东县| 南丰县| 迁安市| 屯昌县| 竹溪县| 紫云| 昌邑市| 尉犁县| 旌德县| 米泉市| 青田县| 东莞市| 河津市| 炎陵县| 万安县| 罗田县| 安多县| 宝鸡市| 台中市| 岢岚县| 保德县|