Linux Shell Script

所需環境

  • Bash

參考文件

大家都知道,Linux 裡的各種指令,都代表著一種專門的小工具,以 ls 來說,這是每位 Linux User 都知道的小小指令,要列出目前目錄裡的物件,都使用 ls 就可以了,但你絕不會想要用 ls 幫你算出目前這個目錄占多少空間!相對的,你會去使用 du 命令來算出目前所在目錄下所有物件所占的容量!

如果說 Linux 世界裡是所有小型工具的集散地,那麼你的 Shell Script 就是整合這些小工具的“特定工具”,再拿出剛剛的列子來說,我想要先印出目前目錄裡的元件,再把所占的空間都算出來,那麼你就要下兩道指令:

# ls
# du -s

這樣就可以達到目標。當然,你可以把兩個小指令寫在一個檔案裡,再去執行他也一樣可以達到效果,假設我們現在來建立一個小小的 script,叫作 print_dir.sh,你可以用 vi,也可以用其它的文字編輯工具來寫你的 Shell Script。

# vi print_dir.sh
__________________________
#!/bin/bash
ls
du -sh
:_________________________
 

好了,只要三行就可以了,然後來再執行他就可以達到效果!
# sh print_dir.sh

你可以使用 sh 指令去執行這個 Script 檔,也可以直接打 ./print_dir.sh 來執行,但是一旦你選擇後者之後,您必需讓這個 print_dir.sh 有執行的權限,使用以下命令調整。
# chmod a+x print_dir.sh

如此就可以了!

了解了簡單的 Script 概念之後,再接下來,就要開始談談 Shell Script 了!

Shell Script

在 Linux 下我們可以直接下達指令,比方說 ls、tar、df、du ... 等等的指令,其實都是下達給 Shell,然後 Shell 再依指令行事。目前 Shell 有 rsh、csh 和 bash 這三種比較有人使用,其中又以 bash shell 最為普級,Bash Shell 是有 GNU 來維護的,並且可以在各平台使用。假如您之前有看過相關的 Linux 入門書籍,你可能會跳過 Shell Script 章節,但現在您又在這裡看到了關於 Shell Script 的章節,相信您一定會提出一個疑問:Shell Script 到底是什麼?

Shell Script 介紹

什麼叫 Shell Script,其實 Shell Script 也沒有什麼,就是一個腳本,說白一點,就是把所有一系列的指令都寫在同一個檔案裡,叫做 Script,Script 有很多種,JavaScript、VB Script ... 喔,不要超出主題了,在這裡指的是為 Shell 所設計的 Script。

為什麼要寫 Script?可以不寫嗎?簡單來說,寫 Script 會讓管理者節省很多時間,打個比方來說,今天為了要開帳號,然後就下達 useradd 這個指令,一個人還好,但是上百個人可能會要了管理者的命,也許從此對管理工作會產生一種厭惡感,如果現在使用 Script 來達成,那麼一次新增上百個使用者帳號就會非常簡單,也許只需要準備帳號/密碼檔就可以了。

再一個例子,拿備份動作來講好了,要備份一個目錄可能沒什麼,備份完之後再確認是否有成功也不算什麼。現在試想看看,一間公司有很多單位,每個單位都有其重要的資料需要備份,那麼這個時候就要考慮是否要使用程式來代替人工一條一條的下指令了,因為這種重複性的工作可以會讓人發瘋的!

初級 Bash Shell Script

初級 Shell Script,說實在的也沒有什麼,就是把所有一系列的指令都丟到一個檔案裡,然後執行它就好了!Shell Script 就是這樣!

在撰寫 Script 一點要注意的就是事情處理的先後順序,也就是說當您在下達指令時,一定會有先後順序,總該不可能還沒有前頭就想要看尾巴吧!因此您可以把 Script 看成您在下的指令,這樣應該會比較好理解。

在選寫 Script 時,首先要注意幾件事:

  • 文件要使用 Unix 格式
  • 選擇編輯工具
  • 寫完之後要注意權限問題

    文件要使用 Unix 格式

    在撰寫 Script 時,您或許會想要先在 Windows 下撰寫,但是千萬要記得一點,請您要使用 Unix 的格式來寫,依經驗,如果使用 DOS 格式來寫的話,最後執行時會發生錯誤。假若您在 Windows 下使用 UltraEdit 這個軟體來編輯您的 Shell Script 的話,那麼請記得轉換格式(DOS to Unix),萬一您真的不知如何轉換,那麼也沒有關係,在 Linux 下會有相關的指令可以幫助您來轉換,只要您下達 dos2unix 這個轉換指令就 OK 了!

    選擇編輯工具

    在 Windows 下,可以使用記事本、UltraEdit ... 等文字編輯器來寫,當然,如果您想要用 Word 也可以,That's OK!

    如果您已經習慣在 Linux 文字模式下使用 vi 工具來設定檔案,那麼您也只需要 vi 就可以了,撰寫 Script 不需要使用什麼具有特異功能的文字處理程式來寫,簡單就好!

    寫完之後要注意權限問題

    這個理由很簡單,當您寫好好精心設計的 Script 檔案時,總是希望這個 Script 可以跑吧,不過一般在新增建立一個 Script 時,只有讀和寫的權限,無法執行,所以可以使用 chmod 讓這個檔案變成可執行的。

好,現在就使用上一章的備份為例子,做出備份的 Script。

建立一個 Shell Script 檔案

我們用 vi 編輯了一個 sample.sh 的 Script 檔,目的就是在做完備份後還能顯示出 /backup 裡有沒有 source_code.tar.gz 這個備份完之後的檔案。
[root@test root]# vi sample.sh
______________________________
#!/bin/sh
#備份 /source_code 裡的資料都壓縮到 /backup/source_code.tar.gz 裡。
tar -zcvf /backup/source_code.tar.gz /source_code/
cd /backup/
ls -l
~
~
~
~
:________________________
 

編輯好之後就儲存起來。

更改權限

修改一下 sample.sh 的權限,讓這個檔案有"可執行"的權限。

[root@test root]# chmod 700 sample.sh
[root@test root]# ls -l
total 4
-rwx------ 1 root root 81 May 22 16:53 sample.sh
[root@test root]#

執行第一個 Shell Script

如果要執行已寫好的 Script 檔,請輸入完整的路徑,假如檔案是在目前的工作目錄下,那麼請輸入 ./sample.sh 就可以直接執行了。
[root@test root]# ./sample.sh

好了,以上就是三行搞定的簡單 Script,然而這算是最陽春的了,並不包含程式部份。簡單來講就是把一系列的動作都塞到 Script 裡,然後讓它自己執行,您要做的就是等待最後 ls -l 的最後結果。

程式化 Bash Shell

到底需不需要程式化 Bash Shell,這個問題就依管理者自己所處的環境而定,如果需要對資料做條件式判斷、同一時間重覆多次命令或條件式回應,那麼這就需要讓 Shell Script 程式化了。

基本上 Bash Shell 本身就提供了程式功能,以便管理者能便有彈性的去強化 Script 檔,讓主機的管理便方便。當然,您不必覺得太惶恐,因為這不像寫 C 一樣這種大工程,寫 Bash Script 的成就感可能會大於寫 C 的成就感,因為你可以很容易的就上手,不用 include 什麼標頭檔,如果出錯時也會很容易的知道自已錯的地方在那裡。在本章,我們只討論 if ... elif ... else ...fi 、for ... do ... done、case ... esac 的常用語法。

判斷式

if [ 條件一 ]; then
     執行一
elif [ 條件一 ]; then
    執行二
else
    執行三
fi

多個條件

在 if 裡的條件式裡,同一個判斷行可以有很多的條件,可以使用邏輯運算符號來表示:

  • && 且
  • || 或
  • == 等於
if [ "$TEST1" == "1234" ] && [ "$TEST2" == "45678" ]; then

上面這句話的意思就是說當變數 $TEST1 等於 1234 並且 變數 $TEST2 等於 45678 的時候才做動作,否則跳到下一個條件式。

if [ "$TEST1" == "1234" ] || [ "$TEST2" == "45678" ]; then

上面這句話的意思就是說當變數 $TEST1 等於 1234 或變數 $TEST2 等於 45678 的時候(亦即兩個條件只要一個成立)就做動作,否則跳到下一個條件式

檔案判斷

以下是常用的檔案判斷

檔案、目錄的類型判斷

  • -f:檢查檔案是否存在
  • -d:檢查目錄是否存在
  • -e:檢查檔案或目錄是否存在

範例

if [ -f /etc/fstab ]; then

if [ -d /etc ]; then

if [ -e /etc ]; then

檔案、目錄的權限判斷

  • -r:檢查該檔案、目錄是否可讀
  • -w:檢查該檔案、目錄是否可寫
  • -x:檢查該檔案、目錄是否可執行

範例

if [ -r /etc/fstab ]; then
    echo "You can read this file."
fi
if [ -w /etc/fstab ]; then
    echo "You have the \"write\" permission for this file."
fi
if [ -x /etc/fstab ]; then
    echo "You have the \"execute\" permission for this file."
fi

解釋

上面的三個列子,會逐一簡查 /etc/fstab 這個檔案是否可以讀取、寫入和執行,如果符合就顯示相關訊息。如果您是以 root 身份來執行的話,那麼結果應該會顯示

You can read this file.
You have the "write" permission for this file.

的樣示。

選擇式判斷

case 值 in
參考值一)
    執行一
    ;;
參考值二)
     執行二
    ;;
參考值三)
    執行三
    ;;
*)
    執行預設動作
    exit 1
esac

case 可以讀取所給的值,然後再依序尋找相符的條件,如果符合就執行動作,若都沒有找到符合的,就執行預設動作。

範列

test=1
case $test in
1)
    echo "Value 1"
    ;;
2)
    echo "Value 2"
    ;;
3)
    echo "Value 3"
    ;;
*)
    echo "Can not find the value."
    exit 1
esac

解釋

首先先設定一個變數 test,然後在使用 case 讀到 test 的變數值,再依續判斷是否有符合條件的,如果有就執行動作,若沒有就執行預設動作。在本例中,會顯示
Value 1

的字樣。

迴圈

for 變數 in 已宣告的變數集值
do
    要重覆的動作
done

範列

NAME="Steven Tom Lisa Sandy"

for i in $NAME
do
    echo $i
done

 

解釋

首先先設定 NAME 的字串集合,然後在 for 裡建立一個變數 i 去讀取 NAME 的變數值,再依續顯示出來。在本列中,會顯示

Steven
Tom
Lisa
Sandy

的字樣。

Index