Linux Bashs Shell撰寫程序?qū)嶋H應(yīng)用介紹
如同在 Linux 中其他的 shell,Bourne Again SHell 不只是一個優(yōu)秀的指令行式的 shell,同時也提供 scripting 語言。Shell scripting 允許你完全利用 shell 的功能,將需要許多指令執(zhí)行的多項工作自動化。在你的 Linux 機器上有許多程序是 shell 程序。如果你對學(xué)習(xí)他們?nèi)绾芜\作,或修改他們感興趣,基本要素是你必須了解 bash 的語法和語意。除此之外,了解 bash 語言,你能夠撰寫你個人專屬的程序,來完成你要做的事情。
PROGRAMMING OR SCRIPTING?
對于剛開始接觸程序設(shè)計的新手,常會對于 programming 和 scripting 語言間的差異感到困惑。Programming 語言通常比 Scripting 語言功能更強大,也更快速。例如:C, C++, 和 Java 都是 Programming 語言。 Programming 語言通常是從源代碼 (一個包含最終程序如何執(zhí)行的指令集合文字檔) 開始,經(jīng)過編譯 (建立) 成為一個可執(zhí)行檔。這個可執(zhí)行檔不容易移植到不同的操作系統(tǒng)中。舉例來說,如果你曾在 Linux 上寫過 C 的程序,你將不能夠在視窗 98 系統(tǒng)上執(zhí)行這個 C 的程序。要這樣做,你必須在視窗 98 系統(tǒng)之下,重新編譯原始的程序碼。Scripting 語言也是從源代碼開始,但不需編譯成可執(zhí)行檔。而是由一個直譯器讀入源代碼檔案里的那些指令,再執(zhí)行每個指令。不幸地,直譯的程序通常比編譯的程序慢,因為直譯器必須讀入每個指令。主要的優(yōu)點是,你能輕松地轉(zhuǎn)換源代碼檔案到任何的操作系統(tǒng),并且立刻以直譯的方式執(zhí)行。bash 是一種 scripting 語言。它對撰寫小程序而言是不錯的,但如果你打算開發(fā)大型的應(yīng)用程序, programming 語言可能對你比較有益。其他的 scripting 語言有 Perl, Lisp 和 Tcl 等等。
WHAT DO YOU NEED TO KNOW? / 那些是你需要知道的?
撰寫你自己的 shell 程序,需要知道最基本的 Linux 指令。舉例來說,你應(yīng)該知道要如何拷貝,移動,產(chǎn)生新檔案等等。還有一件事你必須知道,該如何使用文書編輯程序。在 Linux 里有三個主要的文字檔編輯程序 - vi, emacs 和 pico。如果對 vi 或 emacs 并不熟悉,可用 pico 或一些其他容易使用文字檔編輯程序。
WARNING!!! / 警告!??!
別以 root 的身份來練習(xí)!任何情況都可能發(fā)生!若你在撰寫程序時發(fā)生意外的錯誤,導(dǎo)致系統(tǒng)當(dāng)?shù)?,我并不負?zé)。你已被警告過了!一定要使用沒有 root 權(quán)限的一般使用者帳戶。你甚至可以產(chǎn)生一個新的使用者,專門來練習(xí) shell 程序設(shè)計。這樣,最糟的情況只是這個使用者的目錄不見了。
YOUR FIRST BASH PROGRAM / ***個 BASH 程序
我們的***個程序會是典型的 "Hello World" 程序。不要懷疑,若你已有程序設(shè)計的經(jīng)驗,你現(xiàn)在又必須頭疼了。然而,這是傳統(tǒng),我何德何能改變傳統(tǒng)呢?"Hello World" 程序只是將 "Hello World" 這字眼列印到螢?zāi)簧?。所以趕快打開你的文字檔編輯程序,鍵入下列的內(nèi)容:
#!/bin/bash
echo "Hello World"
***行是告訴 Linux 用 bash 直譯器來執(zhí)行這個程序。在這個范例,bash 是位在 /bin 目錄下。如果在你的系統(tǒng)上, bash 是在不同的目錄,請對這行做適當(dāng)?shù)母?。另外,要特別說明的是,這個直譯器是非常重要,所以請確定目錄正確否,它告訴 Linux 哪一個直譯器用來執(zhí)行程序中的那些指令。下一步是把將程序存檔。稱它做 hello.sh 好了。完成后,你需要讓此程序可以執(zhí)行:
xconsole$ chmod 700 ./hello.sh
如果你不知道該如何更改檔案的權(quán)限,就參考 chmod 的手冊(manual page)。一旦更改完成后,你僅需輸入程序的名字,就能執(zhí)行了:
xconsole$ ./hello.sh
Hello World
就是這個光!就是這個光!你的***個程序完成了!真的就是這樣無聊,沒用,然而每個人都是這樣開始的。只需記得這個程序。撰寫程序碼,存成檔案,再用 chmod 讓它可執(zhí)行。
COMMANDS, COMMANDS, COMMANDS / 指令,指令,指令
你的***個程序要做什么呢?列印 "Hello World" 這兩個字到螢?zāi)簧?。但要怎樣做呢?使用指令。在程序中寫?**一行程序碼是 echo "Hello World"。好吧,那一個是指令? echo。echo 程序帶有一個參數(shù),并將此參數(shù)列印到螢?zāi)弧?br />
所謂參數(shù)是指在你所鍵入的程序名稱之后的任何東西。在這個案例中,"Hello World" 是參數(shù),它傳進 echo 指令中。若你輸入這樣的指令 ls /home/root ,那么對 ls 而言, /home/root 是參數(shù)。就竟這代表什么呢?代表如果你有一支程序,可將參數(shù)列印到螢?zāi)簧希憔筒恍枋褂?echo 程序。我們假定有支稱為 foo 的程序,能傳入一個參數(shù),一個字串,并且將其列印到螢?zāi)簧?。我們能同樣地重寫我們的程序?
#!/bin/bash
foo "Hello World"
把它存檔及更改存取模式(chmod),然后執(zhí)行:
xconsole$ ./hello
Hello World
結(jié)果完全一樣。究竟有***的程序碼嗎?沒有。你真的能寫任何程序?除非你是 echo 程序的作者。你所做的,是將 echo 程序放在你的 shell 程序內(nèi),并給一個參數(shù)。在現(xiàn)實的世界中,例子中 echo 指令的另一選擇是 printf 指令。printf 提供比較多的控制,如果你熟悉 C 語言的程序設(shè)計就會明了。事實上,要得到完全相同的結(jié)果不必寫一個 shell 程序:
xconsole$ echo "Hello World"
Hello World
bash shell 程序設(shè)計提供了多樣的控制方式,而且容易學(xué)習(xí)。就如你剛看到一樣,你用 Linux 指令來寫你的 shell 程序了。你的 shell 程序是將其他的程序聚集在一起,來執(zhí)行特定的任務(wù)。
A MORE USEFUL PROGRAM / 更有用的程序
我們將撰寫一個程序,功能是移動所有的檔案到一個目錄內(nèi),然后刪除此目錄及其內(nèi)容,然后再產(chǎn)生此目錄。這可由下列的指令來完成:
xconsole$ mkdir trash
xconsole$ mv * trash
xconsole$ rm -rf trash
xconsole$ mkdir trash
不需在交談式的 shell 上敲進所有指令,改用撰寫個 shell 程序:
#!/bin/bash
mkdir trash
mv * trash
rm -rf trash
mkdir trash
echo "Deleted all files!"
把它以 clean.sh 存檔,現(xiàn)在你所要做的是執(zhí)行 clean.sh,它會移動所有的檔案到一個目錄,刪除他們,再產(chǎn)生目錄,而且列印一個訊息告訴你,它已成功地刪除所有的檔案。所以記得,如果你發(fā)現(xiàn)要做的某些事,要一而再,再而做三地做下去,考慮用個 shell 程序來自動執(zhí)行。
COMMENTS / 注解
注解可讓你的程序更容易明了,這樣并不影響程序的輸出結(jié)果。目的就是來特別幫你明了程序。所有在 bash 里的注解,***個字元都是用井字符號 (hash symbol):"#",除了***個行 (#!/bin/bash) 外。 ***行并不是注解。在***行之后,其馀以 "#" 開始的任何一行都是注解??聪铝械某绦蚱危?
#!/bin/bash
# 這個程序從 1 記錄到 10:
for i in 1 2 3 4 5 6 7 8 9 10; do
echo $i
done
即使你不知道 bash 的程序設(shè)計,因為注解的關(guān)系,也能立刻知道上述的程序在做什么事。使用注解是很好的習(xí)慣。你將發(fā)現(xiàn)若未來需要維護你的程序,有注解會比較容易。
【編輯推薦】