這裡我首先會介紹一個Shell是什麼,再介紹我的第一個Shell程序和從中總結的經驗。
一、Shell是什麼
在說我的這個Shell程序之前,還是先跟大家說說什麼是Shell吧,相信Shell這個詞大家一定聽過很多了,但是它其實是什麼東西呢?其實Shell是一個程序,我們在shell中輸入一些命令,它就告訴操作系統內核我們想做什麼,好讓內核可以控制硬件來正確無誤地工作。簡單點來說就是,Shell的功能只是提供一個用戶操作系統的接口,而這個shell則可以調用其他的程序來完成這些操作,只要能操作應用程序的接口都叫Shell。而現在的Linux中的Shell默認都是/bin/bash這個Shell。
什麼是Shell程序?簡單點來說,編寫一個可以在Shell中直接運行文件。說白了就是跟大家在Shell中直接輸入命令差不多,只不過是把它按照一定的法則寫到了一個文件中,然後直接執行那個文件來執行裡面的寫好命令而已。
二、我的第一個Shell程序
#! /bin/bash # filename:FileType.sh read -p "Please input the filename :" filename fpath=$filename if [ -d $fpath ]; then echo "$fpath is a direstory."; elif [ -e $fpath ]; then echo "$fpath is a file."; else echo "$fpath is NOT a file or direstory."; 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也可以不加雙引號和單引號,不過這樣的話,你就無法在要顯示中文本中使用命令定界符。