在 Linux 中,有時候需要對多條命令進行組合才能完成一項任務,或者多個對象要使用同樣一組命令,我們都希望採用一種便捷化的方式來執行,而不必在 shell 中一行一行地輸入命令,此時就需要到 shell 腳本。
什麼是 shell 腳本
與編程語言的源文件一樣,shell 腳本只是將符合 shell 的語法和命令進行搭配,以達到處理某一項任務的目的。
此時可以將 shell 腳本看作是一種特殊編程語言的源文件,能夠在 shell 中執行。
爲什麼要了解 shell 腳本
其實是有需要看懂 shell 腳本的需要,剛打開 .sh 文件的時候,真的是不能夠特別理解。因此纔想要了解一下,但其實利用 shell 腳本能夠做到的事情有很多:
- 自動化管理
- 系統跟蹤和管理
- 入侵檢測
- 數據處理
- 組合命令
- 跨平臺支持
其實 shell 腳本完全可以當作是一種編程語言來認識,只是 shell 腳本多用於系統管理上。因爲 shell 腳本其實就是一個一個的命令,命令在逐行執行中,會佔用系統資源,因此 shell 腳本在大規模數值運算上的性能就顯得有點弱了。
shell 腳本的規則
一般情況下,shell 腳本和其它編程語言是類似的,都有一定的規則:
- 命令自上而下,自左向右執行
- 忽略多餘的空格,tab 也被視爲空格
- 忽略空白行
- 讀取到換行符,就開始執行本行命令
- 命令過長可以用轉義字符進行擴展
- 可以添加註釋,符號爲 #
之前提到過,Linux 中命令的執行順序爲:
- 以相對路徑或者絕對路徑執行命令,如之前提到的 /bin/ls
- 由命令別名找到對應命令並執行
- 由 bash 內置命令來執行
- 通過 ${PATH} 變量順序查找並執行
這也就是說我們可以使用多種方法運行構建的 shell 腳本。
- 相對路徑/絕對路徑
- 命令別名
- bash shname/sh shname
- 將 shell 腳本路徑添加到 ${PATH} 中
編程習慣
這個編程習慣說的就不單單是 shell 腳本的編程習慣了,而是所有的編程語言最好都有的一種書寫習慣。
在編程的源文件中最好有:
- 功能描述
- 版本信息
- 作者和聯繫方式
- 版權聲明
- History
- 特殊命令使用絕對路徑
- 實現聲明環境
- 對實現某一功能的代碼塊添加註釋
- 良好的書寫格式
當然有時候自己寫的腳本不需要包含這麼多的條目,但是爲了程序的可讀性,儘量要包含功能描述,書寫格式和代碼註釋。
Hello world
這裏我們編寫名爲 exp.sh 的 shell 腳本實現 “Hello world”:
# Description: using shell script to implement Hello world.
# Version: 1.0
# Author: wood
# Address: None
# Copyright: None
# History: None
PATH=${PATH}
export PATH
echo -e "Hello world"
exit 0
然後實現調用:
wood@ubuntu:/tmp/test$ ll
total 12
drwxrwxr-x 2 wood wood 4096 Apr 7 10:43 ./
drwxrwxrwt 14 root root 4096 Apr 7 10:45 ../
-rw-rw-r-- 1 wood wood 199 Apr 7 10:43 exp.sh
wood@ubuntu:/tmp/test$ chmod +100 exp.sh
wood@ubuntu:/tmp/test$ ll
total 12
drwxrwxr-x 2 wood wood 4096 Apr 7 10:43 ./
drwxrwxrwt 14 root root 4096 Apr 7 10:45 ../
-rwxrw-r-- 1 wood wood 199 Apr 7 10:43 exp.sh*
wood@ubuntu:/tmp/test$ ./exp.sh
Hello world
wood@ubuntu:/tmp/test$ bash exp.sh
Hello world