本系列針對(duì)Bash Shell,其他的比較流行的Shell還有Korn shell (ksh)和"Tenex C shell" (tcsh)。
一 簡(jiǎn)單過程
1)可以使用任意一種文字編輯器,比如nedit、kedit、emacs、vi等來編寫shell腳本。ubuntu中可以使用gedit,notpad++也不錯(cuò)啊。
2)文件必須以#!/bin/sh開始。符號(hào)#!用來告訴系統(tǒng)那個(gè)shell來執(zhí)行該腳本的程序,系統(tǒng)中可以有多個(gè)shell,例如使用/bin/sh,/bin/bash。
3)編輯結(jié)束并保存后,如果要執(zhí)行該腳本,必須先使其可執(zhí)行,使用命令chmod +x filename。
4)此后在該腳本所在目錄下,輸入 ./filename 即可執(zhí)行該腳本。
5)最簡(jiǎn)單的調(diào)試方法當(dāng)然是使用echo命令。你可以在任何懷疑出錯(cuò)的地方用echo打印變量值。
6)可以用sh -x strangescript來調(diào)試。
7)可以使用sh -n your_script來檢查語法,不執(zhí)行。
8)以# 開始的行表示注釋,直到該行的結(jié)束。
二 命令
可以使用所有的Unux的命令。
三 變量
Shell編程中,使用變量無需事先聲明,同時(shí)變量名的命名須遵循如下規(guī)則:1. 首個(gè)字符必須為字母(a-z,A-Z)2. 中間不能有空格,可以使用下劃線(_)3. 不能使用標(biāo)點(diǎn)符號(hào) 4. 不能使用bash里的關(guān)鍵字(可用help命令查看保留關(guān)鍵字)。
要給變量賦值時(shí),可以這么寫:變量名=值, 等號(hào)兩邊均不能有空格存在。為了避免混淆,可以使用{}給變量,如${num}。
四 管道/重定向
* 管道 (|) :將一個(gè)命令的輸出作為另外一個(gè)命令的輸入 :grep "hello" file.txt | wc -l 。 上述命令會(huì)在file.txt中搜索包含有”hello”的行并計(jì)算行數(shù),這里grep命令的輸出成了wc命令的
輸入。
* 重定向:將命令的結(jié)果輸出到文件,而不是標(biāo)準(zhǔn)輸出(屏幕) > 寫入文件并復(fù)蓋舊文件,>> 加到文件的尾部,保留舊文件內(nèi)容。
* 反短斜線:反短斜線可以將一個(gè)命令的輸出作為其它命令的命令行參數(shù)。find . -mtime -1 -type f -print。上述命令可以查找過去24小時(shí)(-mtime –2則表示過去48小時(shí))內(nèi)修改過的文件。如果您想將所有查找到的文件打一個(gè)包,則可以使用以下腳本:
#!/bin/sh
# The ticks are backticks (`) not normal quotes ('):
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
* 單引號(hào)‘’:功能則最強(qiáng)。當(dāng)你把字符串用單引號(hào)括起來時(shí),外殼將忽視所有單引號(hào)中的特殊字符。
* 雙引號(hào)“”:雙引號(hào)的功能最弱。當(dāng)你把字符串用雙引號(hào)括起來時(shí),外殼將忽略字符串中的空格,但其他的字符都將繼續(xù)起作用。雙引號(hào)在將多于一個(gè)單詞的字符串賦給一個(gè)變量時(shí)尤其有用。
* 反斜杠\:反斜杠的功能和單引號(hào)一樣,只是反斜杠每次只能使一個(gè)字符發(fā)生轉(zhuǎn)義,而不是使整個(gè)字符串發(fā)生轉(zhuǎn)義。
五 特殊字符
• 有些變量在啟動(dòng)外殼時(shí)就已經(jīng)存在于系統(tǒng)中,你可以使用這些系統(tǒng)變量,并且可以賦予
新值:
$HOME 用戶自己的目錄。
$ PATH 執(zhí)行命令時(shí)所搜尋的目錄。
$TZ 時(shí)區(qū)。
$MAILCHECK 每隔多少秒檢查是否有新的郵件。
$ P S 1 在外殼命令行的提示符。
$ P S 2 當(dāng)命令尚未打完時(shí),外殼要求再輸入時(shí)的提示符。
$ M A N PATHman 指令的搜尋路徑。
• 有些變量在執(zhí)行外殼程序時(shí)系統(tǒng)就設(shè)置好了,并且你不能加以修改:
$ # 存儲(chǔ)外殼程序中命令行參數(shù)的個(gè)數(shù)。
$ ? 存儲(chǔ)上一個(gè)執(zhí)行命令的返回值。
$ 0 存儲(chǔ)外殼程序的程序名。
$ * 存儲(chǔ)外殼程序的所有參數(shù)。
$ @ 存儲(chǔ)所有命令行輸入的參數(shù),分別表示為(“$ 1” “$ 2” . . . )。shift 命令用來將存儲(chǔ)在位置參數(shù)中的當(dāng)前值左移一個(gè)位置。
$ $ 存儲(chǔ)外殼程序的P I D。
$ ! 存儲(chǔ)上一個(gè)后臺(tái)執(zhí)行命令的P I D。
六 關(guān)鍵字
1)if
if [ expression ]
then
commands
elif [ expression2 ]
then
commands
else
commands
fi
2)條件,條件之間可以使用&& 和||
-b file 若文件存在且是一個(gè)塊特殊文件,則為真
-c file 若文件存在且是一個(gè)字符特殊文件,則為真
-d file 若文件存在且是一個(gè)目錄,則為真
-e file 若文件存在,則為真
-f file 若文件存在且是一個(gè)規(guī)則文件,則為真
-g file 若文件存在且設(shè)置了SGID位的值,則為真
-h file 若文件存在且為一個(gè)符合鏈接,則為真
-k file 若文件存在且設(shè)置了"sticky"位的值
-p file 若文件存在且為一已命名管道,則為真
-r file 若文件存在且可讀,則為真
-s file 若文件存在且其大小大于零,則為真
-u file 若文件存在且設(shè)置了SUID位,則為真
-w file 若文件存在且可寫,則為真
-x file 若文件存在且可執(zhí)行,則為真
-o file 若文件存在且被有效用戶ID所擁有,則為真
-z string 若string長(zhǎng)度為0,則為真
-n string 若string長(zhǎng)度不為0,則為真
string1 = string2 若兩個(gè)字符串相等,則為真
string1 != string2 若兩個(gè)字符串不相等,則為真
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為假則復(fù)合表達(dá)式為真。expr可以是任何有效的測(cè)試表達(dá)式
expr1 -a expr2 若expr1和expr2都為真則整式為真
expr1 -o expr2 若expr1和expr2有一個(gè)為真則整式為真
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
七 子函數(shù)
fname () {
shellcommands
}
調(diào)用fname [parm1 parm2 parm3 ...]
完!
感謝,Thanks!
作者:iTech
出處:http://itech.cnblogs.com/
轉(zhuǎn)載:本文版權(quán)歸作者iTech所有,轉(zhuǎn)載請(qǐng)注明出處,不得用于商業(yè)用途!