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
donefor in
list="test1 test2"
for VAR in $list
do
echo list=$VAR
doneuntil 無窮迴圈寫法
until false
do
echo "程式碼"
donecase條件判斷
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
很棒~ 謝謝
不客氣~(๑•̀ㅁ•́ฅ)