0%

Linux (十二) - Shell Script 的撰寫 I

image alt

Shell Script 是用來為 Shell 所編寫的腳本,會將一些指令寫在同一個腳本中一次執行,所以還蠻類似批次執行的概念。不過 Shell Script 不是只有放指令而已,他還可以做到像寫程式一樣來撰寫。Shell Script 是不需要編譯 (Compile) 的,他是一行一行執行的直譯器 (Interpreter)。

透過撰寫 Shell Script,可以簡化許多工作的時間,例如,每次有新的 Server 要進行環境設定時,就需要下非常多的指令。如果把這些指令全都寫在 Shell Script 中,以後只要執行這個 Shell Script 就可以自動執行完這些指令了。

Shell Script 的用法

Shell Script 就是一個純文字檔,可以直接編輯。Shell Script 會以 .sh 作為檔案的類型,例如 : hello.sh。建立好的 .sh 檔必須要可以讀取和執行 (rx),所以執行前要先加上讀取和執行的權限。

接著就可以來執行了,而執行的方式有以下幾種 :

  • 使用 bash 程式來執行 :
1
bash ./hello.sh
  • 使用 sh 來執行,而 sh 其實就是 /bin/bash 的連結而已,所以使用 sh 就等同使用 bash
1
sh ./hello.sh

下面列出了 shbash 的詳細資料,可以看到 sh 是一個連結檔並且指向 bash

1
2
3
4
5
$ cd /bin && ll | grep sh
-rwxr-xr-x 1 root root 964536 Apr 1 2020 bash
...
lrwxrwxrwx 1 root root 4 Nov 13 01:53 sh -> bash
...
  • 直接指定 .sh 檔,如果要這樣執行的話必須將 .sh 檔放在 /bin 或是 /usr/bin 等等的目錄下,至於可以放在哪些目錄下就要看你的 PAHT 變數有定義哪些目錄了。如果不知道什麼是 PATH 變數,請參考 上一篇 所介紹的環境變數。
1
hello.sh

開始撰寫 Shell Script

大致了解了 Shell Script 的概念和使用方式後,我們就要開始來撰寫 Shell Script 了。我們用下面這個範例來解說。

1
2
3
4
5
#!/bin/bash
# Hello World program
tmp="hello world"
echo $tmp
exit 0

可以看到我們先建了一個 hello.sh 的 Shell Script 檔,而檔案的內容可以分為以下幾個區塊 :

  • 宣告使用的 Shell :
    在第一行會宣告要使用哪個 Shell,宣告的格式為 #!<shell>。所以以上面這個範例來說,我們要用 bash,那就要宣告成 #!/bin/bash

  • Shell Script 內容說明 :
    第二行開始通常會寫一些關於這個 Shell Script 的內容,例如 : 功能、版本、作者、建立時間等等。而撰寫內容說明都是以註解的方式來寫,只要在前面加上 # 即可成為註解。

  • 變數宣告 :
    接著如果有變數要使用的話就可以先宣告了,例如環境變數等等。

  • 主程式 :
    上述都完成後,就可以開始撰寫主要的程式部份了,以這個範例來說就是第 4 行的 echo 指令。

  • 執行結果 :
    指令的執行結果可以透過 $? 這個變數來查看,而我們可以使用 exit 指令來中斷程式的執行並且回傳一個數值。所以如果這個 Script 有順利的完成的話,當執行 echo $? 就會顯示 0。

執行 Shell Script

上述介紹完了 Shell Script 的撰寫格式後,接著就把這個 Shell Script 執行起來。首先先賦予 hello.sh 讀和執行的權限。接著使用 sh 來執行 hello.sh,可以看到成功的輸出了 hello world !。最後再印出 $? 變數來看一下回傳值有正確的回傳 0。

1
2
3
4
5
6
7
$ chmod +rx hello.sh

$ sh hello.sh
hello world !

$ echo $?
0

使用 source 執行 Shell Script

一般使用 sh 執行 shell script 時,會開啟一個 child process 來執行,因此目前 process 所設定的變數並不能被 child process 所使用。若是要讓 script 在目前的 process 執行,可以使用 source 指令來執行。

首先我們先在目前的 process 設定一個變數

1
$ tmp=123

接著我們寫一個 script 把這個變數印出來

1
2
3
4
5
6
$ vi sample.sh
#!/bin/bash

echo ${tmp}

exit 0
  • 使用 sh
1
$ sh sample.sh
  • 使用 source
1
2
$ source sample.sh
123

可以看到使用 sh 執行沒有讀到 tmp 的值,因此印出來的是空的值。而 source 有讀到,因此有正確的印出 tmp 的值。

數值運算

在 shell script 中進行數值的運算可以使用 declare 來定義變數的型態,不過 declare 只能先定義成整數後才能進行運算,也就是 declare i ...。也可以使用 num=$((運算式)) 來進行運算。而使用兩個小括號則裡面的運算式就可以有空白。

四則運算

下面是一個簡單的加法運算:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
# Addition Program

echo 'Please input two numbers'
read -p 'num1: ' num1
read -p 'num2: ' num2

sum=$(($num1 + $num2))

echo "Sum is $sum"
exit 0

接著我們執行這個加法運算的 shell script:

1
2
3
4
5
$ sh addition.sh 
Please input two numbers
num1: 1
num2: 2
Sum is 3

小數點運算

Shell Script 預設只能進行整數的運算,如果需要進行有小數點的運算則可以搭配 bc 這個指令來進行。下面是一個簡單的除法運算,除法不可避免的就可能會有小數點,所以在下面的範例中,我們搭配 bc 來進行計算,並且可以設定 scale 來要求要輸出的小數點位數。

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# Division Program

echo 'Please input two numbers'
read -p 'num1: ' num1
read -p 'num2: ' num2

ans=$(echo "scale=5; $num1/$num2" | bc)
echo "The answer is $ans"
exit 0

接著我們執行這個除法運算的 shell script:

1
2
3
4
5
$ sh division.sh
Please input two numbers
num1: 78
num2: 47
The answer is 1.65957

Summary

本篇我們介紹了基本的 shell script 撰寫方式以及簡單的四則運算,下一篇我們將介紹 shell script 中如何使用條件判斷式。

參考

[1] 程式筆記 Shell Script 簡易筆記
[2] 學習 Shell Scripts | 鳥哥
[3] Linux 計算機 bc 指令的用法教學與範例