身為 UNIX 系統管理者除了要熟悉 UNIX 指令外,我們最好學會幾種 scripts 語言,例如 shell script 或 perl。學會 script 語言後,我們就可以將日常的系統管理工作寫成一支執行檔,如此一來,在管理系統時就可以更加靈活。
Shell script 是最基本的 script 語言,它是一堆 UNIX 指令的集合。本章將介紹 Shell script 的基本功能及語法,期望讀者可以經由學習 Shell scripts 讓使用 UNIX 系統時可以更加得心應手。
Shell Script
身為 UNIX 系統管理者除了要熟悉 UNIX 指令外,我們最好學會幾種 scripts 語言,例如 shell script 或 perl。學會 script 語言後,我們就可以將日常的系統管理工作寫成一支執行檔,如此一來,在管理系統時就可以更加靈活。
Shell script 是最基本的 script 語言,它是一堆 UNIX 指令的集合。本章將介紹 Shell script 的基本功能及語法,期望讀者可以經由學習 Shell scripts 讓使用 UNIX 系統時可以更加得心應手。
1 概論
Shell Script 是一個類似 MS Windows 中 .bat 檔的東西,簡單的說,Shell Script 就是將一堆 shell 中的指令放在一個文字文件中來執行。因此,為了能寫出一個 shell Script,你必須先對 UNIX 指令有初步的認識。身為一個 UNIX 系統的管理者,一定要會使用 shell script 來使管理工作更加容易。
一般我們會將 Shell Script 的擴展名命名為 .sh,但並非一定要這麼做,這樣做只是為了要讓我們更容易管理這些檔案。在介紹如何 Shell Script 的內容之前,我們先來看如何寫出一個 Shell Script 並執行它。假設我們要寫一個名為 test.sh 的 Shell Script,首先用你習慣使用的文字編輯軟件來開一個文件名為 test.sh 內容如下:
CODE:#!/bin/sh
echo Hello world!!第一行是必需的,用來定義你要使用的 shell。這裡我們定義要使用的是 Bourne Shell,其所在路徑是 /bin/sh。在 UNIX 系統中有許多不同的 Shell 可以使用,而每個 Shell 的特性及用法都有些許的不同。因此,在寫 Shell Script 時,我們會針對 Bourne Shell (sh) 來寫,因為 sh 是所有 UNIX 系統中都會有的 Shell。就算你執行 Shell Script 時的環境不是使用 sh,只要加上第一行 #!/bin/sh 就可以在執行此 Shell Script 時使用 sh。而第二行的 echo 代表列出一個字符串,我們常使用它來輸出信息。將 test.sh 存盤後,我們就可以用下列其中一種方式執行它:
1. 轉向輸入
CODE:$ sh < test.sh2. 如果要輸入參數的話,第一種方式便不適用,可以改用這種方法。 就是我們要輸入的參數,在上面的 test.sh 中並不需要輸入參數:
CODE:$ sh test.sh <arguments>3.你也可以改變 test.sh 的權限,將它變成可以獨立執行的檔案,這樣就可以只打 test.sh 來執行它:
CODE:$ chmod a+x test.sh
$ ./test.sh在 Shell Script 中,你們可以使用 # 為批注,在 # 後面的字符串都將被視為批注而被式忽略。而分號 ; 則代表新的一行,例如打 ls;ls -d 代表二個指令。另外,我們可以使用變量、流程控制、甚至是副函式來使程序更加靈活。以下的各章節我們會詳細加以說明。
2 變量的使用
2.1 變量的使用
我們知道 Shell Script 是使用一堆指令拼湊而成,為了方便說明及練習起見,我們不使用編輯檔案的方式來執行,而改以在命令列中打我們要的指令。首先,先打 sh 來進入 Bourne Shell。
CODE:% sh
$在打了 sh 之後,會進入 Bourne Shell,其一般使用者的提示字符為 $。以下各指令開頭的 $ 表示提示字符,而 $ 之後的粗體字才是我們輸入的字符串。
在 Shell Script 中,所有的變量都視為字符串,因此並不需要在定義變量前先定義變量類型。在 Shell 中定義和使用變量時有些許的差異。例如,我們定義一個變量 color 並令它的值為 red,接著使用 echo 來印出變量 color 的值:
CODE:$ color=red
$ echo $color
red在這裡,以 color=red 來定義變量 color 的值為 red,並以 echo $color 來印出 color 這一個變數。在定義變量時,不必加 $,但是在使用它時,必須加上 $。請注意,在等號的二邊不可以有空白,否則將出現錯誤,系統會誤以為你要執行一個指令。
我們再介紹一個范例:
CODE:$ docpath=/home/td/src/doc
$ echo $docpath
/home/td/src/doc
$ ls $docpath
abc.txt abc2.txt semmt.doc
$ ls $docpaht/*.txt
abc.txt abc2.txt這裡我們定義了變量 docpath 的值為 /home/td/src/doc,並印出它。接著我們使用 ls 這個指令來印出變量 docpath 目錄中所有檔案。再以 ls $docpath/*.txt 來印出 /home/td/src/doc/ 目錄下所有擴展名為 .txt 的檔案。
我們再來看一個例子,說明如何使用變量來定義變量:
CODE:$ tmppath=/tmp
$ tmpfile=$tmppath/abc.txt
$ echo $tmpfile
/tmp/abc.txt另外,我們也可以使用指令輸出成為變量,請注意這裡使用的二個 ` 是位於鍵盤左上角的 ` ,在 shell script 中,使用 ` 包起來的代表執行該指令:
CODE:$ now=`date`
$ echo $now
Mon Jan 14 09:30:14 CST 2002如果在變量之後有其它字符串時,要使用下列方式來使用變量:
CODE:$ light=dark
$ echo ${light}blue
darkblue
$ echo "$light"blue
darkblue這裡雙引號中的字將會被程序解讀,如果是使用單引號將直接印出 $light 而非 dark。
經由上面幾個簡單的例子,相信您對變量的使用已有初步的認識。另外有一些我們必須注意的事情:
CODE:$ color=blue
$ echo $color
blue
$ echo "$color"
blue
$ echo '$color'
$color
$ echo $color
$color
$ echo one two three
one two three
$ echo "one two three"
one two three我們可以看到上面各個執行結果不大相同。在 Shell Script 中,雙引號 " 內容中的特殊字符不會被忽略,而單引號中的所有特殊字符將被忽略。另外, 之後的一個字符將被視為普通字符串。
如果您希望使用者能在程序執行到一半時輸入一個變量的值,您可以使用 read 這個指令。請看以下的范例:
CODE:#!/bin/sh
printf "Please input your name:"