Skip to content

Instantly share code, notes, and snippets.

@freelze
Last active July 21, 2025 15:50
Show Gist options
  • Save freelze/fd2160d749722ebbee21e76bbe21631f to your computer and use it in GitHub Desktop.
Save freelze/fd2160d749722ebbee21e76bbe21631f to your computer and use it in GitHub Desktop.
#!/bin/bash
# --- 預設設定 ---
INPUT_FILE="IP_table.txt"
BMC_IP_COLUMN=3
NAME_COLUMN=1
REFRESH_INTERVAL=3
# --- 函數定義 ---
# 顯示使用說明
usage() {
echo "用法: $0 [-i <範圍>]"
echo "描述: 即時監控 DVT 系統的感測器資訊。"
echo
echo "選項:"
echo " -i, --items <範圍> 指定要顯示的項目行號。範圍格式可以是:"
echo " '2' (只顯示第 2 項)"
echo " '1-3' (顯示第 1, 2, 3 項)"
echo " '5-' (顯示第 5 項到最後一項)"
echo " '1,3,5-7' (組合顯示)"
echo " -h, --help 顯示此幫助訊息並退出。"
echo
exit 1
}
# --- 解析命令列參數 ---
FILTER_MODE=false
declare -A SELECTED_LINES # 使用關聯陣列來儲存要顯示的行號,查詢效率高
while [[ $# -gt 0 ]]; do
key="$1"
case $key in
-i|--items)
if [[ -z "$2" || "$2" == -* ]]; then
echo "錯誤: 選項 '$1' 需要一個參數。" >&2
usage
fi
FILTER_MODE=true
FILTER_STRING="$2"
shift 2
;;
-h|--help)
usage
;;
*)
echo "錯誤: 未知的選項 '$1'" >&2
usage
;;
esac
done
# --- 處理篩選字串 ---
if [ "$FILTER_MODE" = true ]; then
# 將逗號替換為空格,方便 for 迴圈處理
for item in ${FILTER_STRING//,/ }; do
if [[ $item =~ ^[0-9]+$ ]]; then # 處理單個數字,例如 '2'
SELECTED_LINES[$item]=1
elif [[ $item =~ ^[0-9]+-[0-9]*$ ]]; then # 處理範圍,例如 '1-3' 或 '5-'
start=${item%-*}
end=${item#*-}
if [ -z "$end" ]; then # 如果是開放式範圍 '5-'
end=999999 # 使用一個極大的數字代表 "到最後"
fi
for ((i=start; i<=end; i++)); do
SELECTED_LINES[$i]=1
done
else
echo "錯誤: 篩選範圍 '$item' 格式無效。" >&2
exit 1
fi
done
fi
# --- 主程式 ---
trap 'echo -e "\n\n監控已停止。"; exit 0' INT
if [ ! -f "$INPUT_FILE" ]; then
echo "錯誤: 找不到輸入檔案 '$INPUT_FILE'" >&2; exit 1;
fi
if ! command -v nitro-bmc &> /dev/null; then
echo "錯誤: 'nitro-bmc' 指令未找到。" >&2; exit 1;
fi
# 主監控迴圈
while true; do
clear
echo "--- 正在監控 DVT 系統感測器 (每 ${REFRESH_INTERVAL} 秒刷新,按 Ctrl+C 停止) ---"
echo "最後更新時間: $(date)"
echo ""
data_line_counter=0 # 資料行的計數器,忽略註解和空行
while IFS=',' read -r name os_ip bmc_ip k2_ip || [[ -n "$name" ]]; do
if [[ "$name" =~ ^# || -z "$name" ]]; then
continue # 跳過註解行和空行
fi
data_line_counter=$((data_line_counter + 1))
# *** 核心篩選邏輯 ***
# 如果在篩選模式下,且當前行號不在被選中的清單中,則跳過
if [ "$FILTER_MODE" = true ] && [[ ! -v SELECTED_LINES[$data_line_counter] ]]; then
continue
fi
echo "${name}:"
sensor_data=$(nitro-bmc --no-prompt --bmc-ip "$bmc_ip" sensors list 2>/dev/null | grep -i 'AMB\|POWER')
if [ -n "$sensor_data" ]; then
echo "$sensor_data"
else
echo " (無法取得感測器資料或無匹配項)"
fi
echo "========================================="
done < "$INPUT_FILE"
sleep "$REFRESH_INTERVAL"
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment