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 白色
4 comments
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
hen bang
很棒~ 謝謝
不客氣~(๑•̀ㅁ•́ฅ)