在Shell Script中常用的字串和數字比較運算符:
=:等於(字串相等)
!=:不等於(字串不相等)
<:小於(按字典序比較)
>:大於(按字典序比較)
-z:檢查字串是否為空(長度為零)
-n:檢查字串是否非空(長度大於零)
-eq:等於(數字相等)
-ne:不等於(數字不相等)
-lt:小於(數字小於)
-le:小於或等於(數字小於或等於)
-gt:大於(數字大於)
-ge:大於或等於(數字大於或等於)
範例:檢查文件的行數是否大於特定數量。
#!/bin/bash
filename ="test.txt"
最小行數=10
#使用wc指令獲取文件的行數
行數=$(wc -l < "$filename")
#使用if條件句檢查行數是否大於最小行數
if [ $行數 -gt $最小行數 ]; then
echo "$filename 的行數 ($行數 行) 大於 $最小行數 行"
else
echo "$filename 的行數 ($行數 行) 小於 $最小行數 行"
fi
在 Shell script中可以使用文件測試運算符(File Test Operators),用於檢查文件的不同屬性和狀態。
-e FILE:如果 FILE 存在,則為真。
-f FILE:如果 FILE 存在且為一個檔案,則為真。
-d FILE:如果 FILE 存在且為一個目錄,則為真。
-s FILE:如果 FILE 存在且檔案大小不為零,則為真。
-r FILE:如果 FILE 存在且可讀取(有讀取權限),則為真。
-w FILE:如果 FILE 存在且可寫入(有寫入權限),則為真。
-x FILE:如果 FILE 存在且可執行(有執行權限),則為真。
-L FILE:如果 FILE 存在且為一個符號連結(軟連結),則為真。
-p FILE:如果 FILE 存在且為一個命名管道(FIFO),則為真。
-c FILE:如果 FILE 存在且為一個字元特殊文件,則為真。
範例:
if [ -e 文件名 ]; then
echo "文件存在"
else
echo "文件不存在"
fi
if [ -f 文件名 ]; then
echo "文件是一個檔案"
else
echo "文件不是一個檔案"
fi
if [ -d 目錄名 ]; then
echo "文件是一個目錄"
else
echo "文件不是一個目錄"
fi
在Shell script中使用條件語句,可以根據不同的條件執行不同的命令。常見的條件語句結構「if else」、「if … elif … fi」和「case」。以下是這三種流程控制結構的介紹:
條件語句 if else:
首先判斷「if」後的條件,如果條件為true,則執行「then」和「else」之間的命令。如果條件為false,則執行「else」後的命令,用if為條件語句開頭,fi為條件語句結尾。
if 條件
then
# 如果條件為True,執行這裡的命令
else
# 如果條件為False,執行這裡的命令
fi
範例:檢查變數x是否等於10
x=10
if [ "$x" -eq 10 ]
then
echo "x等於10"
else
echo "x不等於10"
fi
條件語句if … elif … fi:
首先評估「if」後的條件1。如果條件1為true,則執行相應的命令,如果條件1為false,則繼續評估「elif」後的條件2,以此類推。如果所有條件都為false,則執行「else」後的命令。
if 條件1
then
# 如果條件1為真,執行這裡的命令
elif 條件2
then
# 如果條件2為真,執行這裡的命令
else
# 如果以上所有條件都不滿足,執行這裡的命令
fi
範例:根據不同的分數顯示不同的評級:
score=85
if [ "$score" -ge 90 ]
then
echo "評級:A"
elif [ "$score" -ge 80 ]
then
echo "評級:B"
elif [ "$score" -ge 70 ]
then
echo "評級:C"
else
echo "評級:不及格"
fi
條件語句case
case 語句用於執行多重選擇的命令,根據匹配的條件執行相應的命令。基本的 case 語法結構如下:
case 值 in
條件1)
條件1匹配時執行的命令
;;
條件2)
條件2匹配時執行的命令
;;
*)
沒有任何匹配時執行的命令
;;
esac
範例:檢查用戶輸入的文件名稱,然後使用case語句檢查不同的選項。每個選項對應不同的執行命令。
#!/bin/bash
#提示用戶輸入文件名
echo "請輸入文件名:"
read filename
#使用case語句檢查文件狀態
case "$filename" in
-e)
if [ -e "$1" ]; then
echo "文件存在。"
else
echo "文件不存在。"
fi
;;
-d)
if [ -d "$1" ]; then
echo "這是一個目錄。"
else
echo "這不是一個目錄。"
fi
;;
-r)
if [ -r "$1" ]; then
echo "文件可讀。"
else
echo "文件不可讀。"
fi
;;
-w)
if [ -w "$1" ]; then
echo "文件可寫。"
else
echo "文件不可寫。"
fi
;;
-x)
if [ -x "$1" ]; then
echo "文件可執行。"
else
echo "文件不可執行。"
fi
;;
*)
echo "請輸入有效的選項:"
echo "-e 檢查文件是否存在"
echo "-d 檢查是否為目錄"
echo "-r 檢查文件是否可讀"
echo "-w 檢查文件是否可寫"
echo "-x 檢查文件是否可執行"
;;
esac
Shellscript中的迴圈是一種常用的控制結構,可以重複執行一段程式碼,直到滿足某個條件為止,或者只是按照指定的次數重複執行。無論是for還是while迴圈,都需要在程式中有終止條件來控制迴圈,以免變成無限迴圈。常見的迴圈有for迴圈和while迴圈,以下是for和while迴圈的結構和範例:
for迴圈
for 迴圈用於遍歷一個列表或一個範圍,對列表中的每個元素執行相同的命令。基本語法如下:
for 變數 in 列表; do
執行的命令
done
範例:使用for迴圈印出簡單的三角形範例,使用兩個巢狀的for迴圈,外部的迴圈控制行數,內部的迴圈控制每行中星號的數量。每當內部的迴圈執行完畢後,我們在最後加上一個echo指令,以換行,這樣就會在每行的末尾創建一個新行,形成三角形的形狀。
#!/bin/bash
for ((i=1; i<=5; i++))
do
for ((j=1; j<=i; j++))
do
echo -n "*"
done
echo # 換行
done
輸出結果:
*
**
***
****
*****
while 迴圈
while迴圈會在條件為真時一直執行指定的程式碼塊,直到條件變為假為止。可用於處理需要重複執行,但不知道具體次數的情況。
while 條件
do
# 當條件為真時執行的程式碼
done
範例:while迴圈計算1到5的總和:
#!/bin/bash
sum=0
i=1
while [ $i -le 5 ]
do
sum=$((sum + i))
i=$((i + 1))
done
echo "總和: $sum"
函式結構包括函式名稱、函式的程式碼和可選的返回值。函式內部的程式碼可以使用參數來接收傳遞給函式的值,並且可以執行各種操作。
function 函式名稱 {
# 函式的程式碼
# 可以使用傳遞給函式的參數
# 函式的操作
# ...
# 返回值(可選)
}
如何使用函式來建立一個簡單的CI/CD(持續集成/持續交付)程式的範例,該程式可以自動構建和部署一個網站應用程序。實際的CI/CD環境中,可以根據需要擴展這些函式,並將其結合到CI/CD工具(如Jenkins、Gitlab、GitHub Actions等)中以自動執行。
#!/bin/bash
# 函式:構建應用程序
build_app() {
echo "開始構建應用程序..."
# 在此處執行構建命令,例如使用npm、docker build等
# 構建完成後將應用程序的檔案放在指定目錄中
echo "應用程序構建完成"
}
# 函式:測試應用程序
test_app() {
echo "開始測試應用程序..."
# 在此處執行測試命令,例如使用Jest、Mocha、Selenium等
# 檢查測試結果,如果測試失敗,可以中止部署
echo "測試完成,一切正常"
}
# 函式:部署應用程序
deploy_app() {
echo "開始部署應用程序..."
# 在此處執行部署命令,例如使用rsync、scp、Docker Compose等
# 部署完成後,應用程序將在目標伺服器上運行
echo "應用程序部署完成"
}
# 主程式
echo "CI/CD流程開始"
# 呼叫函式依次執行CI/CD步驟
build_app
test_app
deploy_app
echo "CI/CD流程完成"