本系列針對Bash Shell,其他的比較流行的Shell還有Korn shell (ksh)和"Tenex C shell" (tcsh)。
一 簡單過程
1)可以使用任意一種文字編輯器,比如nedit、kedit、emacs、vi等來編寫shell腳本。ubuntu中可以使用gedit,notpad++也不錯啊。
2)文件必須以#!/bin/sh開始。符號#!用來告訴系統那個shell來執行該腳本的程序,系統中可以有多個shell,例如使用/bin/sh,/bin/bash。
3)編輯結束并保存后,如果要執行該腳本,必須先使其可執行,使用命令chmod +x filename。
4)此后在該腳本所在目錄下,輸入 ./filename 即可執行該腳本。
5)最簡單的調試方法當然是使用echo命令。你可以在任何懷疑出錯的地方用echo打印變量值。
6)可以用sh -x strangescript來調試。
7)可以使用sh -n your_script來檢查語法,不執行。
8)以# 開始的行表示注釋,直到該行的結束。

二 命令
可以使用所有的Unux的命令。

三 變量
Shell編程中,使用變量無需事先聲明,同時變量名的命名須遵循如下規則:1. 首個字符必須為字母(a-z,A-Z)2. 中間不能有空格,可以使用下劃線(_)3. 不能使用標點符號 4. 不能使用bash里的關鍵字(可用help命令查看保留關鍵字)。
要給變量賦值時,可以這么寫:變量名=值, 等號兩邊均不能有空格存在。為了避免混淆,可以使用{}給變量,如${num}。

四 管道/重定向
*  管道 (|) :將一個命令的輸出作為另外一個命令的輸入 :grep "hello" file.txt | wc -l 。 上述命令會在file.txt中搜索包含有”hello”的行并計算行數,這里grep命令的輸出成了wc命令的
輸入。
* 重定向:將命令的結果輸出到文件,而不是標準輸出(屏幕) > 寫入文件并復蓋舊文件,>> 加到文件的尾部,保留舊文件內容。
* 反短斜線:反短斜線可以將一個命令的輸出作為其它命令的命令行參數。find . -mtime -1 -type f -print。上述命令可以查找過去24小時(-mtime –2則表示過去48小時)內修改過的文件。如果您想將所有查找到的文件打一個包,則可以使用以下腳本:
#!/bin/sh
# The ticks are backticks (`) not normal quotes  ('):
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
* 單引號‘’:功能則最強。當你把字符串用單引號括起來時,外殼將忽視所有單引號中的特殊字符。
* 雙引號“”:雙引號的功能最弱。當你把字符串用雙引號括起來時,外殼將忽略字符串中的空格,但其他的字符都將繼續起作用。雙引號在將多于一個單詞的字符串賦給一個變量時尤其有用。
* 反斜杠\:反斜杠的功能和單引號一樣,只是反斜杠每次只能使一個字符發生轉義,而不是使整個字符串發生轉義。

五 特殊字符
• 有些變量在啟動外殼時就已經存在于系統中,你可以使用這些系統變量,并且可以賦予
新值:
$HOME 用戶自己的目錄。
$ PATH 執行命令時所搜尋的目錄。
$TZ 時區。
$MAILCHECK 每隔多少秒檢查是否有新的郵件。
$ P S 1 在外殼命令行的提示符。
$ P S 2 當命令尚未打完時,外殼要求再輸入時的提示符。
$ M A N PATHman 指令的搜尋路徑。
• 有些變量在執行外殼程序時系統就設置好了,并且你不能加以修改:
$ # 存儲外殼程序中命令行參數的個數。
$ ? 存儲上一個執行命令的返回值。
$ 0 存儲外殼程序的程序名。
$ * 存儲外殼程序的所有參數。
$ @ 存儲所有命令行輸入的參數,分別表示為(“$ 1” “$ 2” . . . )。shift 命令用來將存儲在位置參數中的當前值左移一個位置。
$ $ 存儲外殼程序的P I D。
$ ! 存儲上一個后臺執行命令的P I D。

六 關鍵字
1)if
if [ expression ]
then
commands
elif [ expression2 ]
then
commands
else
commands
fi
2)條件,條件之間可以使用&& 和||

-b file            若文件存在且是一個塊特殊文件,則為真
-c file           
若文件存在且是一個字符特殊文件,則為真
-d file           
若文件存在且是一個目錄,則為真
-e file           
若文件存在,則為真
-f file           
若文件存在且是一個規則文件,則為真
-g file           
若文件存在且設置了SGID位的值,則為真
-h file           
若文件存在且為一個符合鏈接,則為真
-k file           
若文件存在且設置了"sticky"位的值
-p file           
若文件存在且為一已命名管道,則為真
-r file           
若文件存在且可讀,則為真
-s file           
若文件存在且其大小大于零,則為真
-u file           
若文件存在且設置了SUID位,則為真
-w file           
若文件存在且可寫,則為真
-x file           
若文件存在且可執行,則為真
-o file           
若文件存在且被有效用戶ID所擁有,則為真

-z string          string長度為0,則為真
-n string         
string長度不為0,則為真
string1 = string2 
若兩個字符串相等,則為真
string1 != string2
若兩個字符串不相等,則為真

int1 -eq int2      int1等于int2,則為真
int1 -ne int2     
int1不等于int2,則為真
int1 -lt int2     
int1小于int2,則為真
int1 -le int2     
int1小于等于int2,則為真
int1 -gt int2     
int1大于int2,則為真
int1 -ge int2     
int1大于等于int2,則為真

!expr              expr為假則復合表達式為真。expr可以是任何有效的測試表達式
expr1 -a expr2    
expr1expr2都為真則整式為真
expr1 -o expr2    
expr1expr2有一個為真則整式為真

3)case
case string1 in
str1 )
commands ; ;
str2 )
commands ; ;
* )
commands ; ;
esac
4)for
for var1 in list
do
commands
done
5)while
while expression
do
statements
done
6)until
until expression
do
commands
done
7)select
select menuitem [in list_of_items]
do
commands
done
七 子函數
fname () {
shellcommands
}
調用fname [parm1 parm2 parm3 ...]

 完!

 

感謝,Thanks!

作者:iTech
出處:http://itech.cnblogs.com/
轉載:本文版權歸作者iTech所有,轉載請注明出處,不得用于商業用途!