我們在嵌入式的開發中,難免會要用到腳本。常用的也就是 makefile 和 shell 腳本了,之前我們學習了 makefile 相關的知識,接下來我們也將要學習 shell 相關的知識,以便在以後的嵌入式開發中能更快、更高效的完成任務。學習於果子玩轉 Linux 下 SHELL 編程。
那麼什麼是 shell 呢?shell 是結餘用戶與系統之間,幫助用戶與系統進行溝通的工具。關係如下圖
那麼除了文字模式的 shell 外,GNOME、KDE 這類圖形界面也屬於 shell 的範疇。我們通常提到的 shell 都指的是狹義上的 shell,即文字模式的 shell。一般來說,shell 可以分成兩類。第一類是由 Bourneshell 衍生出來的包括 sh,ksh,bash 與 zsh;第二類是由 CShell 衍生出來的,包括 csh 與 tcsh。除此之外,還有一個 rc。
那麼我們爲什麼要來學習 shell 呢?其主要原因可以總結爲以下三點:
1、圖形用戶界面只是一個程序套件,文字模式的 shell 功能和能執行的任務則比圖形界面要強的多;
2、shell 是文字模式,因此遠程登錄和傳輸的速度比圖形界面更快;
3、shell 使用起來更方便。
Linux 下的支持的 shell 有好多種,我們學習的就是最常用的 bash shell。現在主要的 Linux 發行版都是用 bash 作爲默認的管理 shell。下來我們就來說說如何編寫一個簡單的 bash shell。
1、使用任何的文本編輯工具進行編寫,如:vim
#!/bin/bash #放置在文件的開頭
2、設置腳本執行權限
chmod a+x filename
chmod 700 filename
3、執行腳本
bash your_script.sh
sh your_script.sh
./your_script.sh
test.sh 源碼
#!/bin/bash echo "hello world!"
運行結果如下
我們看到在執行的時候,它說沒有權限,然後我們執行上面的第二步。再來看看
我們已經成功地用 shell 輸出了經典的 hello world。那麼上面的那句 #!/bin/bash 是什麼意思呢?它的意思是用 bin 目錄下的 bash 腳本解釋器來對其進行解釋。
下來我們來看看 shell 中的變量。在 shell 中,變量分爲系統環境變量和 UDV (user defined variable)變量。系統環境變量是系統本身所有,通常爲大寫字母,系統變量是通過 set 或 declare 指令進行查看;而 UDV 變量則是由用戶創建和爲維護的,我們建議定義其時進行大寫的定義。那麼這時爲什麼呢?因爲 Linux 系統的命令全部採用的是小寫方式,我們應避免衝突與混淆。
那麼 shell 中所有變量定義都是字符串;應區分變量的大小寫,如:var 和 Var 是兩個不同的變量;變量必須以字母或下劃線開頭,不得有“,”;‘:’;“\”等特殊字符。
下來我們來進行下實驗
我們看到在 set | grep PATH 後出現了 PATH 相關的定義。在進行變量的定義時加 , 或者 \ 的時候,都出現了錯誤。下來我們來講講變量的聲明和定義,變量的定義如我們上面所操作的那樣,直接是 變量名=值(變量名與值之間的“=”號沒有空格);如果我們需要聲明帶有空格的變量,那麼我們就必須像定義字符串一樣加上 “” 才行。如果我們需要聲明一個只讀變量,那麼在定義的前面需要加上 readonly;修改環境變量,如PATH=$PATH:/class/bin ,修改用戶自定義變量時,如:DIR="hello"。
我們想要使用變量的話,應在變量前面加 “$”符號,在上面的示例中也展示了。echo $DIR 或 echo ${DIR}。那麼上面兩種用法有何區別呢?我們爲何要在 shell 中使用變量,又爲何要添加界定符 {} 呢?
下來我們還是以實驗爲例來進行講解:第一種寫法:
#!/bin/bash echo "/home/aston/test"
我們來看看執行後的結果
我們再來看看第二種寫法
#!/bin/bash PWD="/home/aston/test" echo $PWD
我們看到效果是一樣的,但是第二種看起來就非常的簡潔明瞭,所以我們在 shell 中定義變量是爲了提高代碼的可讀性。下來我們來看看界定符的作用。在有的版本中,界定符是爲了保證我們如果在一個環境變量後面追加東西時,它會直接寫到這個環境變量的路徑後面。在有的版本中,這個好像沒什麼作用了。不過我們儘量還是加上界定符,以保證最大的正確率。