第十三章 學習 Shell Scripts

2022-03-11 08:43:41 字數 2847 閱讀 3897

什麼是 shell scripts

shell script (程式化指令碼) :shell script 是針對 shell 所寫的『指令碼!』

shell script 是利用 shell 的功能所寫的乙個『程式

(program)』,這個程式是使用純文字檔,將一些 shell 的語法與命令(含外部命令)寫在裡面,

搭配正規表示法、管線命令與資料流重導向等功能,以達到我們所想要的處理目的。

shell script 就像是早期 dos 年代的批量檔 (.bat) ,最簡單的功能就是將許多命令彙整寫在一起,

讓使用者很輕易的就能夠 以one touch 的方法去處理複雜的動作 (執行乙個檔案 "shell script" ,就能夠一次執行多個命令)。

shell script 可以被看成是批量檔,

也可以被說成是乙個程式語言,且這個程式語言由於都是利用 shell 與相關工具命令,

所以不需要編譯即可執行,且擁有不錯的除錯 (debug) 工具。

幹嘛學習 shell scripts

shell script

處理資料的速度是不快。因為 shell script 用的是外部的命令與 bash shell

的一些預設工具,所以,他常常會去呼叫外部的函式庫,因此,運算速度上面比不上傳統程式語言。shell script 用在系統管理上面是很好的一項工具,但是用在處理大量數值運算上,

就不夠好了,因為 shell scripts 的速度較慢,且使用的 cpu 資源較多,造成主機資源的分配不良。

第一支 script 的撰寫與執行

shell script是純文字檔

注意事項:

命令的執行是從上而下、從左而右的分析與執行;

命令的下達:

命令、選項與引數間的多個空白都會被忽略掉;

空白行也將被忽略掉,並且 [tab] 按鍵所推開的空白同樣視為空白鍵;

如果讀取到乙個 enter 符號 (cr) ,就嘗試開始執行該行 (或該串) 命令;

如果一行的內容太多,則可以使用『 \[enter] 』來延伸至下一行;

『 # 』可做為註解!任何加在 # 後面的資料將全部被視為註解文字而被忽略!

在 script 內所撰寫的程式會被一行一行的執行。現在我們假設你寫的這個程式檔名是

/home/dmtsai/shell.sh 好了,如何執行:

以 bash 程式來執行:透過『 bash shell.sh 』或『 sh shell.sh 』來執行

/bin/sh 是 /bin/bash (鏈結檔),使用 sh shell.sh

亦即告訴系統,直接以 bash 的功能來執行 shell.sh 這個檔案內的相關命令,所以此時 shell.sh 只要有 r 的許可權即可被執行!也可以利用 sh 的引數,如 -n 及 -x

來檢查與追蹤 shell.sh 的語法是否正確

[root@www ~]# mkdir scripts; cd scripts

[root@www scripts]# vi sh01.sh

#!/bin/bash

# program:

# this program shows "hello world!" in your screen.

# history:

# 2005/08/23 vbird first release

path=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export path

echo -e "hello world! \a \n"

exit 0

第一行 #!/bin/bash 在宣告這個 script 使用的 shell 名稱:

因為我們使用的是 bash ,所以,必須要以『#!/bin/bash』來宣告這個檔案內的語法使用

bash 的語法!那麼當這個程式被執行時,他就能夠載入 bash 的相關環境配置檔 (一般來說就是 non-login shell 的 ~/.bashrc),

並且執行 bash 來使我們底下的命令能夠執行!(在很多狀況中,如果沒有配置好這一行,

那麼該程式很可能會無法執行,因為系統可能無法判斷該程式需要使用什麼 shell 來執行!)

程式內容的說明:

整個 script 當中,除了第一行的『 #! 』是用來宣告 shell 的之外,其他的 # 都是『註解』用途!

所以上面的程式當中,第二行以下就是用來說明整個程式的基本資料。一般來說,

建議你一定要養成說明該 script 的:1. 內容與功能; 2. 版本資訊; 3. 作者與聯絡方式;

4. 建檔日期;5. 歷史紀錄 等等。這將有助於未來程式的改寫與 debug!

如此一來,則可讓我們這支程式在進行時,可以直接下達一些外部命令,而不必寫絕對路徑呢!

主要程式部分

就將主要的程式寫好即可!在這個例子當中,就是 echo 那一行啦!

執行成果告知 (定義回傳值)

乙個命令的執行成功與否,可以使用

$? 這個變數來觀察,可以利用 exit 這個命令來讓程式中斷,並且回傳乙個數值給系統。

在我們這個例子當中,鳥哥使用 exit 0 ,這代表離開 script 並且回傳乙個 0 給系統,

所以我執行完這個 script 後,若接著下達 echo $? 則可得到 0 的值!

[root@www scripts]# sh sh01.sh

hello world !

另外,你也可以利用:『chmod a+x sh01.sh; ./sh01.sh』來執行這個 script !

撰寫 shell script 的良好習慣建立

第十三章 併發

13.1 動機 13.2 基本執行緒 如果必須要控制現成的執行順序,最好是根本不用執行緒,而是自己編寫特定順序彼此控制的協作子程式。繼承thread類或者實現runnable介面。內部類實現。13.3 共享受限資源 1 如果要對類中的某個方法進行同步控制,最好同步所有方法。如果忽略了其中乙個,通常很...

第十三章 類

1.類簡單地說是乙個性的資料型別。類當中有資料成員,和成員函式。類的基本思想就是體現出資料的抽象和封裝。2.這裡只需要說明乙個問題即可 就是類成員函式的const型別 class screen public const int get const int i const int j const 這裡...

第十三章 事件

1 事件的作用 事件是對委託的封裝,如同屬性對字段的封裝。封裝後可以在委託上實現更複雜的邏輯。1.1 封裝訂閱 委託允許使用 對其進行賦值,但向乙個委託例項賦值多個委託時,使用 會造成覆蓋之前的委託。事件只支援 或 對事件進行賦值 1.2 封裝發布 委託可以在其他類進行訪問,而事件可以確保只有包容類...