如何通過 Linux Bash 技術,讓你的獨立產品實現一鍵安裝
我在業余時間開發了一款自己的獨立產品:升訊威在線客服與營銷系統。陸陸續續開發了幾年,從一開始的偶有用戶嘗試,到如今線上環境和私有化部署均有了越來越多的穩定用戶。
雖然我編寫了非常詳細的在線文檔,說明如何在不同系統環境下安裝部署,但依然不時收到用戶的咨詢,我想,能否搞個 真一鍵部署 的腳本出來呢?
摸索了幾天,真給搞定了,我通過 Linux Bash 實現了以下幾個功能:
- 支持從 Ubuntu 裸機狀態部署。
- 實現一條命令搞定一切,不再需要手敲命令一步一步操作。
- 參數配置部分,支持圖形界面。
- 自動安裝 Nginx、MySQL 等所需組件。
- 自動配置 Nginx 站點、MySQL 數據庫。
- 自動啟動主程序服務。
我將在本文詳細介紹我是如何編寫這樣一個 bash 腳本的,并且在文章后方列出了總結的 base 腳本編寫常見問題。
效果展示 ??
Ubuntu 一鍵部署:
if [ -f /usr/bin/curl ]; then curl -sSO https://files.shengxunwei.com/kf/installscript/install.sh; else wget -O install.sh https://files.shengxunwei.com/kf/installscript/install.sh; fi; chmod +x install.sh; bash install.sh


如何編寫實現一鍵安裝腳本
Linux Bash(Bash 是 "Bourne Again Shell" 的縮寫)是一個命令行解釋器和腳本語言,它是大多數 Linux 系統的默認 shell(命令行界面)。Shell 是一個程序,它允許用戶通過輸入命令來與操作系統交互,進行文件管理、程序運行等操作。
Bash 提供了強大的功能,比如:
- 命令行交互:可以輸入命令來執行各種操作,如文件操作、程序啟動、網絡配置等。
- 腳本編程:可以將一系列命令寫入腳本文件,并批量執行。常用于自動化任務和系統管理。
- 管道和重定向:支持通過管道將一個命令的輸出作為另一個命令的輸入,或者將輸出重定向到文件中。
- 變量與控制結構:Bash 腳本支持變量、循環、條件判斷等結構,幫助構建復雜的腳本。
- 強大的編輯功能:可以使用歷史命令、自動補全、命令替換等功能,提高效率。
編寫 .sh 腳本(Shell 腳本)其實很簡單,主要是寫一系列的 Linux 命令,通過腳本自動執行:
1. 創建一個 .sh 腳本文件
首先,你需要在 Linux 系統中創建一個文件,擴展名通常是 .sh,例如 myscript.sh。
touch myscript.sh
2. 編寫腳本命令
在腳本文件中,你可以寫下需要執行的命令和邏輯。比如:
#!/bin/bash
# 打印歡迎消息
echo "Hello, World!"
# 定義一個變量
my_variable="This is a shell script!"
# 打印變量
echo $my_variable
# 使用條件判斷
if [ -f /path/to/file ]; then
echo "File exists"
else
echo "File does not exist"
fi
# 使用循環
for i in {1..5}; do
echo "Iteration $i"
done
3. 設置文件權限
你需要確保腳本文件具有可執行權限。使用 chmod 命令:
chmod +x myscript.sh
4. 運行腳本
一旦你完成了腳本并且設置了可執行權限,就可以通過以下命令運行它:
./myscript.sh
示例:一個簡單的 Shell 腳本
下面是一個稍微復雜一些的示例,展示了如何使用輸入參數、文件操作和簡單的循環:
#!/bin/bash
# 檢查用戶是否提供了輸入
if [ -z "$1" ]; then
echo "Usage: $0 <filename>"
exit 1
fi
# 獲取傳入的文件名
filename=$1
# 檢查文件是否存在
if [ -f "$filename" ]; then
echo "File $filename exists."
# 打印文件的內容
cat "$filename"
else
echo "File $filename does not exist."
fi
# 遍歷目錄中的所有文件
echo "Listing files in the current directory:"
for file in *; do
if [ -f "$file" ]; then
echo "$file"
fi
done
常用的 Shell 腳本基礎命令:
echo:打印文本到終端。if/else:條件判斷。for/while:循環。mkdir:創建目錄。touch:創建空文件。cat:顯示文件內容。cp/mv/rm:復制、移動、刪除文件。exit:退出腳本。
6. 調試腳本
如果腳本沒有按預期工作,可以使用 -x 選項來調試腳本。比如:
bash -x myscript.sh
這將顯示每個命令和它的輸出,幫助你找到問題。
如何在腳本中自動安裝 Nginx 和 MySQL
要在一個 Shell 腳本中自動安裝 Nginx 和 MySQL,首先你需要確保你的腳本可以運行必要的安裝命令:
# 更新軟件包列表
echo "Updating package lists..."
sudo apt update
# 安裝 Nginx
echo "Installing Nginx..."
sudo apt install -y nginx
# 安裝 MySQL
echo "Installing MySQL..."
sudo apt install -y mysql-server
# 啟動并設置 Nginx 和 MySQL 開機自啟
echo "Starting Nginx and MySQL..."
sudo systemctl start nginx
sudo systemctl start mysql
sudo systemctl enable nginx
sudo systemctl enable mysql
# 檢查服務狀態
echo "Checking Nginx status..."
sudo systemctl status nginx
echo "Checking MySQL status..."
sudo systemctl status mysql
echo "Nginx and MySQL installation completed."
步驟:
-
復制上面的代碼并保存為一個
.sh文件,比如install_nginx_mysql.sh。 -
賦予腳本執行權限:
chmod +x install_nginx_mysql.sh -
運行腳本:
./install_nginx_mysql.sh
該腳本會自動執行以下操作:
- 更新 Ubuntu 系統的包管理器。
- 安裝 Nginx 和 MySQL。
- 啟動并設置這兩個服務為開機自啟。
- 輸出服務的狀態,確保它們正確啟動。
這樣,你就可以在 Ubuntu 上自動安裝并配置 Nginx 和 MySQL 了。
編寫 bash 腳本常見問題總結
編寫 Shell 腳本時,可能會遇到一些常見問題。了解這些問題可以幫助你更高效地調試和編寫腳本。以下是一些常見的問題及其解決方法:
1. 權限問題
-
問題:無法執行腳本,提示權限不足。
-
原因:腳本文件沒有執行權限。
-
解決方法:為腳本添加執行權限:
chmod +x myscript.sh
2. 路徑問題
- 問題:找不到命令或文件。
- 原因:腳本中的命令或文件路徑沒有指定絕對路徑,或者
PATH環境變量未包含必要的路徑。 - 解決方法:
- 使用絕對路徑。例如:
/usr/bin/nginx,而不是nginx。 - 如果是腳本中調用的文件,確保文件存在于正確的路徑下。
- 可以在腳本中使用
echo $PATH檢查路徑設置。
- 使用絕對路徑。例如:
3. 缺少 shebang 行
-
問題:執行腳本時出錯,尤其是在非交互模式下運行腳本時。
-
原因:沒有指定解釋器,操作系統無法確定該用什么解釋器來執行腳本。
-
解決方法:確保腳本的第一行包含正確的 shebang,例如:
#!/bin/bash
4. 腳本中的變量問題
- 問題:變量值沒有正確傳遞或使用。
- 原因:
- 變量引用時缺少
$符號。 - 使用了未定義的變量。
- 變量值中有空格時沒有加引號。
- 變量引用時缺少
- 解決方法:
- 確保在引用變量時使用
$,如:$my_variable。 - 使用引號包裹帶空格的變量值:
"$my_variable"。
- 確保在引用變量時使用
5. 使用了錯誤的條件語句
-
問題:條件判斷語句未按預期工作,導致腳本執行不正確。
-
原因:
- 在
if語句中,[和]需要空格,且條件表達式內的比較符號(如=)兩側需要有空格。 - 比較數值時使用
-eq等,而不是=。
- 在
-
解決方法:
- 字符串比較:
if [ "$var1" = "$var2" ]; then echo "Strings are equal" fi - 數值比較:
if [ "$var1" -eq "$var2" ]; then echo "Numbers are equal" fi
- 字符串比較:
6. 忘記加 exit 或返回值
-
問題:腳本運行結束時沒有返回值,可能會影響后續腳本或自動化任務。
-
原因:沒有顯式返回退出狀態碼。
-
解決方法:可以在腳本最后添加
exit來返回退出狀態。例如:exit 0 # 正常退出 exit 1 # 異常退出
7. 錯誤的文件/目錄操作
- 問題:刪除或修改錯誤的文件或目錄。
- 原因:
- 沒有檢查文件是否存在。
- 沒有確認文件路徑。
- 誤用了
rm -rf等危險命令。
- 解決方法:
- 在刪除文件之前加上確認步驟:
if [ -f "$file" ]; then rm "$file" else echo "File does not exist." fi
- 在刪除文件之前加上確認步驟:
8. 腳本中的錯誤處理不足
- 問題:腳本執行過程中如果某個命令出錯,后續命令仍然繼續執行,可能導致不可預見的錯誤。
- 原因:沒有正確處理錯誤。
- 解決方法:
-
使用
set -e來使腳本在遇到任何錯誤時退出。 -
使用
||來捕捉并處理命令失敗時的錯誤。例如:command || { echo "Command failed"; exit 1; }
-
9. 循環和條件嵌套不當
- 問題:嵌套的循環或條件語句過多,導致腳本難以理解或出錯。
- 原因:嵌套過深或缺乏適當的退出條件。
- 解決方法:
- 保持代碼簡潔,盡量避免深度嵌套。
- 可以使用函數來分隔不同的邏輯,使腳本結構更加清晰。
10. 輸出重定向和管道問題
- 問題:命令的輸出沒有按預期重定向,或者管道未能正確傳遞數據。
- 原因:
- 沒有正確使用重定向符號
>和>>。 - 管道中傳遞的數據格式不正確。
- 沒有正確使用重定向符號
- 解決方法:
-
使用
>將輸出重定向到文件,>>會將輸出追加到文件。 -
使用管道傳遞命令結果:
command1 | command2
-
11. 環境變量問題
- 問題:腳本無法正確訪問某些環境變量。
- 原因:腳本中沒有正確引用環境變量或沒有在腳本中設置環境變量。
- 解決方法:
-
使用
export設置環境變量,使其在腳本中可用:export MY_VAR="value"
-
12. 空格和縮進問題
- 問題:腳本執行時不按預期工作,代碼難以閱讀。
- 原因:缺少空格、錯誤的縮進或語法錯誤。
- 解決方法:
- 保持一致的縮進(通常使用 2 或 4 個空格)。
- 在操作符、條件、命令之間確保有空格。
簡介下這個 .net 開發的小系統
升訊威在線客服與營銷系統是一款客服軟件,但更重要的是一款營銷利器。
- 可以追蹤正在訪問網站或使用 APP 的所有訪客,收集他們的瀏覽情況,使客服能夠主動出擊,施展話術,促進成單。
- 可嵌入網站、手機 APP、公眾號、或者通過 URL 地址直接聯系客服。
- 支持訪客信息互通,可傳輸訪客標識、名稱和其它任意信息到客服系統,與您的業務系統對接。
- 可全天候 7 × 24 小時掛機運行,網絡中斷,拔掉網線,手機飛行模式,不掉線不丟消息,歡迎實測。


希望能夠打造: 開放、開源、共享。努力打造 .net 社區的一款優秀開源產品。

浙公網安備 33010602011771號