標籤:指令碼 vim unix 終端 shell
Lee出品,轉載請註明出處 http://blog.csdn.net/hnulwt/article/details/43234977
繼續上次學的內容,這次學習 case 語句和 shell的函數概念。
case 語句
首先先看看測試程式:
1 #! /bin/sh 2 3 animal=dog 4 5 case "$animal" in 6 cat) 7 echo "cat";; 8 dog) 9 echo "dog";; 10 lion) 11 echo "lion";; 12 esac
上面程式運行結果很簡單,輸出:dog
他的結構是:
case "變數名" in
字串一)
執行語句一;;
字串二)
執行語句二;;
esac
需要特別注意的幾點是:
1,case 後面的變數名要用引號括起來(上面例子程式中的第5行)
2,匹配條件,字串前面沒有括弧,後面有括弧 (上面程式中的6、8、10行)
3,執行語句結束位置要有雙分號; (上面程式中的7、9、11行)
4,結尾要有倒置的case匹配,即esac
函數
首先我們看一個最簡單的函數,下面是一段程式:
1 #! /bin/sh 2 3 sayDog() 4 { 5 echo "dog" 6 return $? 7 } 8 9 sayDog
程式很簡單,3-7行我們定義了sayDog函數。第六行其實也可以忽略,$? 在之前章節講過是函數的返回值,在第9行我們調用了這個函數。
來看看程式的運行結果:
$ sh test.sh
dog
參數
如何給函數裡面傳入參數呢,shell不像我們寫的java 、c++程式在括弧裡面傳參數,傳參數只需要直接在函數裡面使用$n 既可(n代表傳入的第幾個參數)
看下面這一段程式:
1 #! /bin/sh 2 3 sayAnimals() 4 { 5 echo $1 6 echo $2 7 } 8 9 sayAnimals cat dog
在上面函數的第5、6行,使用了傳入的參數1、參數2。第9行調用函數,並且傳入cat dog倆個參數,我們來看看執行結果:
$ sh test.sh
cat
dog
看到了吧?shell傳入參數其實非常簡單。
返回值
shell的返回值和我們理解的一般的程式返回值是不一樣的,shell 函數返回值只能是整形數值,一般是用來表示函數執行成功與否的,0表示成功,其他值則表示失敗。因而用函數返回值來返回函數執行結果是不合適的。如果return一個字串,則會得到錯誤提示:“numeric argument required”
程式是死的,人是活的嘛,這樣不行,我們可以通過定義全域變數,函數將計算結果賦給全域變數,然後指令碼中其他地方訪問這個全域變數,就可以達到我們的目的啦。
輸入、輸出重新導向
使用過ant 等工具的人可能對這個概念已經不陌生了。
每個 Unix/Linux 命令運行時都會開啟三個檔案:
標準輸入檔案(stdin):stdin的檔案描述符為0,Unix程式預設從stdin讀取資料。
標準輸出檔案(stdout):stdout 的檔案描述符為1,Unix程式預設向stdout輸出資料。
標準錯誤檔案(stderr):stderr的檔案描述符為2,Unix程式會向stderr流中寫入錯誤資訊。
shell的重新導向用於將標準輸出或標準錯誤輸出重新導向到其他位置。
標準輸入,標準輸出,標準錯誤輸出是什麼呢?我們可以理解為:鍵盤是標準輸入,顯示器是標準輸出,錯誤輸出預設仍然是顯示器。
而重新導向就是將本來要輸出在顯示器上的東西,定向到其他位置了,比如檔案中。
輸出重新導向的文法為:指令 > 檔案名稱
我們舉個例子,我們在終端執行命令 ls > test,這時候我們在螢幕上看不到輸出,本來ls就是現實目前的目錄下的檔案,這時候我們已經把這些輸出重新導向到一個叫test的檔案中了。我們通過vim test開啟,可以看到結果。確實結果輸出到test檔案中了。這裡不再圖示,自己執行命令即可。
輸出重新導向還有一個格式:指令 >> 檔案名稱
這個格式會保證 若已存在檔案,則結果追加到輸出到檔案末尾,即不會覆蓋。
輸入重新導向的文法:指令 < 檔案名稱
例子:比如我們有一個檔案test.txt,裡面有3行內容。我們要統計他的行數,可以通過執行命令:wc -l < test.txt來統計
結果輸出:3
好了,通過四節的內容,我們已經掌握shell的基本使用方式,可以寫出一些簡單的shell程式,但是距離真正編碼還是有一段差距的,所以我們還要繼續努力!多練習,多看別人寫的shell程式,達到學習,提升自己的目的。
快速入門shell指令碼編寫(四)