【Linux】【Shell】主控指令碼實現

RadiantJeral發表於2020-12-29

研究學習 Linux Shell 的系列文章.

這篇文章主要講 Shell 主控指令碼的實現.

1. 內容介紹

在這裡插入圖片描述
.../monitor 目錄下有如下4個shell指令碼:

  • monoitor_man.sh:控制執行下面三個指令碼.
  • system_monitor.sh:獲取系統資訊及執行狀態.
  • check_server.sh:ngnix和mysql應用狀態分析.
  • check_http_log.sh:應用日誌分析.

Shell 系列研究學習的第8~11這4篇文章分別介紹這4個shell指令碼的實現.

2. 補充知識

2.1 關聯陣列

在第4篇講到declare命令時,提到過-a選項可以將shell變數宣告為陣列型別,更準確的來說是普通陣列. 而使用-A選項可以將shell變數宣告為關聯陣列.

  • -a 普通陣列:只能使用整數作為陣列索引.
  • -A 關聯陣列:可以使用字串作為陣列索引.
$ declare -A songs
$ songs[Bob]=bbb
$ songs[Ann]=xyz
$ echo ${songs[Ann]}
xyz
$ echo ${songs[Bob]}
bbb
$ echo ${songs[*]}
bbb xyz

2.2 `command`的作用

`command`$(command)的作用是一樣的,將命令輸出的內容儲存在shell變數中.

$ ff=`ls`
$ echo $ff
anaconda-ks.cfg

2.3 tput sgr0 的作用

tput 命令將通過 terminfo 資料庫對終端會話進行初始化和操作. 通過使用該命令,可以更改終端功能,如移動或更改游標、更改文字屬性,以及清除終端螢幕的特定區域.

tput sgr0 表示關閉終端的所有屬性. 在《控制 Bash 輸出的格式與顏色》中介紹過使用轉義序列控制字串的顏色和格式. 在轉義序列後面使用\e[0m取消樣式,避免對後續內容的影響. 在顏色和格式控制中,tput sgr0\e[0m 的作用一致.

2.4 正規表示式匹配

前面文章介紹過正規表示式條件判斷式. [[ A =~ B ]]用於判斷正規表示式是否匹配,其中A是字串,B是正規表示式. 如果A匹配B的模式,則[[ A =~ B ]]返回0;如果不匹配,返回1.

$ [[ 12345 =~ [0-9] ]] && echo 'match' || echo 'not match'
match
$ [[ abcde =~ [0-9] ]] && echo 'match' || echo 'not match'
not match

3. 主控指令碼內容

#!/bin/bash
resettem=$(tput sgr0)
declare -A ssharray
i=0
numbers=""
for script_file in `ls -I "monitor_man.sh" ./`
do
    echo -e '\e[0;1;35m'"The Script:" ${i} '==>' ${resettem} ${script_file}
    grep -E "^\#Program function" ${script_file}
    ssharray[$i]=${script_file}
    numbers="${numbers} | ${i}"
    i=$((i+1))
done

while true
do
    read -p "Please input one number in [ ${numbers} ]:" execshell
    if [[ ! ${execshell} =~ ^[0-9]+ ]]; then
        exit 0
    fi
    /bin/sh ./${ssharray[$execshell]}
done
$ touch check_http_log.sh check_server.sh system_monitor.sh
$ bash monitor_man.sh 

在這裡插入圖片描述

相關文章