在離線或無法訪問外網的環境中,忘記 SQL 語法是常有的事。幸運的是,MySQL 內置了完整的幫助文檔系統,通過 HELP CONTENTS 即可查看。但默認輸出扁平化,缺乏清晰的層級關系(Category → Subcategory → Topic),查找效率低下。
例如想查閱 BACKUP TABLE 語法,它屬於 Administration 還是 Utility 類別?默認輸出無法直觀呈現層級,只能逐個嘗試 HELP 'category',極其繁瑣。
編寫一個 Bash 腳本,利用 MySQL 客戶端交互特性,遞歸遍歷幫助系統,生成類似 tree 命令風格的層級輸出。
HELP CONTENTS 頂級分類列表。HELP 'category_name',分析首行輸出判斷類型:
Name: 'Topic_Name' → 為具體主題(葉子節點)。PLUGINS 分類首行異常(Name: 'SHOW PLUGINS'),需額外判斷。Numeric Functions 包含 / 等特殊字符,無法作為文件名,直接打印其下屬 Topic。number 追蹤遞歸深度,配合 format="|\t\b" 模擬樹狀縮進(├──)。number-- 恢復上層縮進。#!/bin/bash
mkdir /tmp/test
mysql -uroot -p123456 -e "help contents" > /tmp/test/test.txt
sed -i '1d;$d' /tmp/test/test.txt
format="|\t\b"
number=0
function recursive() {
filename=$1
number=$[$number+1]
while read line; do
name=$(echo $line | tr -d [:blank:])
mysql -uroot -p123456 -e "help $line" > $name
firstline=$(head -1 $name)
if [[ "$firstline" == "Name: '$line'" || "$firstline" == "Name: 'SHOW PLUGINS'" ]]; then
for i in $(seq $[$number-1]); do echo -ne $format; done
echo "├── $line"
else
for i in $(seq $[$number-1]); do echo -ne $format; done
echo "├── $line"
if [[ "$line" == "Numeric Functions" ]]; then
sed -i '1d;$d' $name
while read functions; do
for i in $(seq $number); do echo -ne $format; done
echo "├── $functions"
done < $name
else
sed -i '1d;$d' $name
recursive $name
number=$[$number-1]
fi
fi
done < $filename
}
recursive /tmp/test/test.txt
rm -rf /tmp/test
因密碼明文會產生大量警告,建議重定向輸出:sh script.sh > output.txt 2>&1。最終生成清晰的樹狀結構,涵蓋 Account Management、Administration、Data Types、Functions、Geographic Features、Transactions 等十大頂級分類及其完整子主題。
tree 輸出格式:使用 ANSI 轉義序列模擬樹狀結構,可讀性極強。該腳本將原本難以導航的扁平幫助文檔轉化為結構化知識圖譜,極大提升離線環境下的查閱效率。