Last active
July 21, 2025 15:50
-
-
Save freelze/fd2160d749722ebbee21e76bbe21631f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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