shell script 程式設計

基礎及流程控制

變數

宣告變數

變數名稱=值

!!注意 : 等號左右不得有空格

範例 :

myname="WIJ"

取得變數值

底下的兩種寫法都可以,但是建議用{}

echo ${myname}
echo $myname

輸出結果

WIJ
WIJ
宣告變數
等號左右不得有空格

取消變數

unset 變數名稱

此方法,不加任何選項,會先嘗試取消變數,若失敗,再嘗試取消與該變數同名的函式

unset -v 變數名稱

此方法,選項 -v 表示取消的是變數

myname="WIJ"
unset -v myname
echo ${myname}

這時你可以發現輸出為空值

擴展變數

基本型擴展種類範例說明
${變數名稱}變數擴展${filename}替換成該變數的值
$(命令)命令替換${ls -l} 替換成該命令的執行結果
$((算數式))算數擴展$((9+9)) 替換成18

運算符

數學運算符

底下都設定變數為

a = 10
b = 20

注意:條件表達式要放在方括號之間,並且要有空格,例如 [$a==$b] 是錯誤的,必須寫成 [ $a == $b ]

運算符說明範例
+加法expr $a + $b 結果為 30。
-減法expr $a - $b 結果為10。
*乘法expr $a \* $b 結果為 200。
/除法expr $b / $a 結果為 2。
%取餘expr $b % $a 結果為 0。
=賦值a=$b 將把變量b 的值賦給a。
==相等。用於比較兩個數字,相同則返回true。[ $a == $b ] 返回 false。
!=不相等。用於比較兩個數字,不相同則返回true。[ $a != $b ] 返回true。

關係運算符列表

關係符說明範例
-eq檢測兩個數是否相等,相等返回true。[ $a -eq $b ] 返回 true。
-ne檢測兩個數是否相等,不相等返回true。[ $a -ne $b ] 返回true。
-gt檢測左邊的數是否大於右邊的,如果是,則返回true。[ $a -gt $b ] 返回false。
-lt檢測左邊的數是否小於右邊的,如果是,則返回true。[ $a -lt $b ] 返回true。
-ge檢測左邊的數是否大等於右邊的,如果是,則返回true。 [ $a -ge $b ] 返回false。
-le檢測左邊的數是否小於等於右邊的,如果是,則返回true。[ $a -le $b ] 返回true。

邏輯運算符

邏輯符說明範例
&&條件 && 條件,兩個條件必須為true[ $a -lt $b ] && [ $a == $b ] 回傳fasle
條件 ∥ 條件,兩個條件擇一及可[ $a -lt $b ] ∥ [ $a == $b ] 回傳true

if條件判斷

備註!!:條件[]裡面左右之間要有空格
if [ ${platform} -eq 1 ]; then
echo "test"
else
echo "demo"
fi

迴圈

for迴圈

for((i=0;i<10;i++));
do
    echo $i
done

for in

list="test1 test2"
for VAR in $list
do
  echo list=$VAR
done

until 無窮迴圈寫法

until false
do
echo "程式碼"
done

case條件判斷

read -p "請輸入選項(1-2):" platform
case ${platform} in
   1)
     echo "命令區塊1"
     ;;
   2)
     echo "命令區塊2"
     ;;
   *)
     echo "如果輸入其他,則運行這裡"
     ;;
esac

字串、數字、運算 條件判斷

字串
    "wij" == "wij" # 字串相符
    "wij" != "king" # 字串不相符
數字
    1 -eq 1 # 值相等
    1 -ne 2 # 值不相等

函數及傳遞參數

#!/bin/sh
fun_arg() {
    echo "檔案名稱 = " $0
    echo "第一個參數 = " $1
    echo "第二個參數 = " $2
    echo "參數1 + 參數2 = "`expr $1 + $2`
    echo "總共多少個參數 = " $#
    echo "顯示全部參數 = " $*
    echo "shell script的PID碼 = " $$
}

fun_arg 1 2

echo "上一個指令的離開狀況 : " $?
echo "上一個命令執行結束後的回傳值,通常代表成功,非0代表值行過程有誤"

輸出結果

$ sh function.sh
檔案名稱 =  function.sh
第一個參數 =  1
第二個參數 =  2
參數1 + 參數2 = 3
總共多少個參數 =  2
顯示全部參數 =  1 2
shell script的PID碼 =  9156
上一個指令的離開狀況 :  0
上一個命令執行結束後的回傳值,通常代表成功,非0代表值行過程有誤

常用程式碼

dash 轉 bash

查看目前使用是 dash 還是 bash

ls /bin/sh -al
        
lrwxrwxrwx 1 root root 4 11月 16 15:33 /bin/sh -> bash
        
sudo dpkg-reconfigure dash

選no

檢查目錄是否存在

#!/bin/sh
 
if [ -d "/path/to/dir" ]; then
    # 目錄 /path/to/dir 存在
    echo "Directory /path/to/dir exists."
else
    # 目錄 /path/to/dir 不存在
    echo "Directory /path/to/dir does not exists."
fi

檢查檔案是否存在

#!/bin/sh
 
if [ -f "/path/to/dir/filename" ]; then
    # 檔案 /path/to/dir/filename 存在
    echo "File /path/to/dir/filename exists."
else
    # 檔案 /path/to/dir/filename 不存在
    echo "File /path/to/dir/filename does not exists."
fi

判斷作業系統

 #!/bin/sh

source /etc/os-release    #引用os-release資源
case $ID in               #ID是os-release裡面的變數
    debian|ubuntu|devuan)
         echo "程式碼區塊一"
    ;;
    centos|fedora|rhel)
         echo "程式碼區塊二"
    ;;
esac

搜尋指定名稱

grep -o "指定名稱"

等待前面指令執行完畢

wait

變數儲存多個指令

Multiple_Cmd="$(ps -e | grep -o frps)"

使用者提示輸入

read -p "顯示文字:" 變數
範例
read -p "請輸入選項(1-3):" platform

判斷指令是否存在

firwalld=$(command -v firewalld 2>/dev/null)
ufw=$(command -v ufw 2>/dev/null)
if [ $firewalld > /dev/null 2>&1 ]; then
  echo 'firewalld指令存在' 
elif [ $ufw > /dev/null 2>&1 ]; then
  echo 'ufw指令存在' 
else
  echo '不存在任何指令' 
fi

判斷是否為root

#!/bin/bash
if [ $UID -ne 0 ]; then
   echo Non root user. Please run as root.
else
   echo "Root user"
fi

設定文字顏色

顏色指定語法:\e[色碼m 或 \e [文字樣式色碼;文字顏色色碼;背景顏色色碼m (沒有順序性)
還原回原始顏色:\e[0m

COLOR_REST='\e[0m'
COLOR_GREEN='\e[0;32m';
COLOR_RED='\e[0;31m';
echo -e "${COLOR_GREEN}OK${COLOR_REST}"

以下是樣色、顏色及背景顏色的可供選項:

文字樣式:
0 一般樣式
1 粗體
4 加底線
5 灰底
7 文字及背景顏色對調
文字顏色:
30 黑色
31 紅色
32 綠色
33 黃色
34 藍色
35 紫色
36 青綠
37 白色

背景顏色:
40 黑色
41 紅色
42 綠色
43 黃色
44 藍色
45 紫色
46 青綠
47 白色
Last modification:December 8, 2019
If you think my article is useful to you, please feel free to appreciate