Linux Shell 之 我的第一個Shell程式

weixin_34402090發表於2013-07-14

 
這裡我首先會介紹一個Shell是什麼,再介紹我的第一個Shell程式和從中總結的經驗。

一、Shell是什麼
在說我的這個Shell程式之前,還是先跟大家說說什麼是Shell吧,相信Shell這個詞大家一定聽過很多了,但是它其實是什麼東西呢?其實Shell是一個程式,我們在shell中輸入一些命令,它就告訴作業系統核心我們想做什麼,好讓核心可以控制硬體來正確無誤地工作。簡單點來說就是,Shell的功能只是提供一個使用者作業系統的介面,而這個shell則可以呼叫其他的程式來完成這些操作,只要能操作應用程式的介面都叫Shell。而現在的Linux中的Shell預設都是/bin/bash這個Shell。

什麼是Shell程式?簡單點來說,編寫一個可以在Shell中直接執行檔案。說白了就是跟大家在Shell中直接輸入命令差不多,只不過是把它按照一定的法則寫到了一個檔案中,然後直接執行那個檔案來執行裡面的寫好命令而已。

二、我的第一個Shell程式
 
[plain]  view plain copy print ?
 
  1. #! /bin/bash  
  2. # filename:FileType.sh  
  3.   
  4. read -p "Please input the filename :" filename  
  5. fpath=$filename  
  6. if [ -d $fpath ];  
  7.  then  
  8.     echo "$fpath is a direstory.";  
  9. elif [ -e $fpath ];  
  10.  then  
  11.     echo "$fpath is a file.";  
  12. else  
  13.     echo "$fpath is NOT a file  or direstory.";  
  14. fi  

 

這個就是我的第一個Shell程式,功能非常簡單,就是輸入一個檔名,判斷這個檔名是目錄還是檔案,如果兩都都不是,則給出相應的提示。

可別看這是個非常簡單的程式,我在寫這個程式時,由於沒有之前一直在學C和C++,沒有接觸過任何的指令碼語言,所以可以說是寫得錯漏百出,非常艱苦才能它寫到可以執行的。所以我就在這裡把我的經驗說一說,好讓其他的像我一樣一直在學像C++這些靜態強型別語言而沒學過指令碼語言的人少走一些彎路吧。

三、程式分析

1、fpath=$filename
首先來看看這句,在Shell中變數是不用像C或C++那樣,需要先定義再使用,在Shell中,直接寫直接用就行了,filename是上一句中的變數,用以儲存我們輸入的檔名。大家一定要注意一下這句話的寫法,常見的錯誤有如下兩點:

1)fpath = $filename,注意這樣的寫法在Shell中是另一種的意思,即判斷filename的值是否為fpath,注意是fpath,不是fpath這個變數對應的值。因為在Shell中a=b,與a = b,是完全不同的,前者是賦值,後者是比較。這對於寫慣了C/C++的程式設計師來說可能是致命的,因為在C/C++中,a=b,與a = b是完全相同的,而且不少人喜歡第二種寫法,因為這樣寫程式碼比較好看,然而在Shell中卻栽了大根頭。

2)fpath=filename
對於C/C++程式設計師來說,既然filename是一個變數,fpath也是一個變數,則fpath=filename應該是把變數filename的值賦給fpath,應該是沒問題的。但是在Shell中卻不然,因為Shell中的變數都不需要定義,你想讓Shell知道這是一個變數,而不是一個普通的字串,就應該在它的前面加上一個$,所以當你寫成fpath=filename時,它的意思就是fpath這個變數的值賦為filename,而不是filename這個變數所對應的值,因為你沒有加上$號,所以預設filename只是普通的字串。所以當你想把filename的值賦給fpath時,應該寫成fpath=$filename,這時Shell就是認為filename是一個變數,也就會取出filename的值並賦給fpath。

2、if [ -d $fpath ];
第二個值得注意的地方就是這裡了,注意這條語句的所有空格都是必須的,特別要注意的是if與“[”之間一定要有一個空格。因為在Shell中這不是編碼規範或風格的問題,是語法問題。

3、echo "$fpath is a direstory.";
注意,在Shell中雙引號與單引號有所不同的,雖然大家都能列印也字串,但是雙引號中的變數,會用其值來代替,而在單引號中則不會對變數求值。例如,在程式中你輸入:/root,則輸出為:/root is a direstory.。$fpath用/root被代替了。若改為echo '$fpath is a direstory.';,則無論你輸入的內容是什麼哪個目錄都只會輸出:$fpath is a direstory.。還有就是,echo也可以不加雙引號和單引號,不過這樣的話,你就無法在要顯示中文字中使用命令定界符。

以上就是我根據錯誤總結的經驗,希望對大家有幫助,剛剛接觸Shell,如有錯誤,歡迎指出!

 
 

 

相關文章