admin 发表于 2023-12-7 16:08:19

shell 3级菜单案例

#!/bin/bash
bold=$(tput bold)
normal=$(tput sgr0)
PS3="please select a num from menu:"
# #######################################
# Excluded Modules:
# #######################################
EXCLUDED_MODULES="'OGG-USE_OCI_THREAD','OGG-OCI_META_THREAD'"

# #######################################
# Excluded INSTANCES:
# #######################################
# Here you can mention the instances the script will IGNORE and will NOT run against:
# Use pipe "|" as a separator between each instance name.
# e.g. Excluding: -MGMTDB, ASM instances:

EXL_DB="\-MGMTDB|ASM|APX"                           #Excluded INSTANCES .

# ##############################
# SCRIPT ENGINE STARTS FROM HERE ............................................
# ##############################

# #########################
# Check if the OS is Linux:
# #########################
case `uname` in
      Linux ) export SHOW_OS_COMMAND="";;
        *)        export SHOW_OS_COMMAND="--";;
esac

# ###########################
# Listing Available Databases:
# ###########################

# Count Instance Numbers:
INS_COUNT=$( ps -ef|grep pmon|grep -v grep|egrep -v ${EXL_DB}|wc -l )

# Exit if No DBs are running:
if [ $INS_COUNT -eq 0 ]
then
   echo No Database Running !
   exit
fi

# If there is ONLY one DB set it as default without prompt for selection:
if [ $INS_COUNT -eq 1 ]
then
   export ORACLE_SID=$( ps -ef|grep pmon|grep -v grep|egrep -v ${EXL_DB}|awk '{print $NF}'|sed -e 's/ora_pmon_//g'|grep -v sed|grep -v "s///g" )

# If there is more than one DB ASK the user to select:
elif [ $INS_COUNT -gt 1 ]
then
    echo
    echo "Select the ORACLE_SID:"
    echo ---------------------
    select DB_ID in $( ps -ef|grep pmon|grep -v grep|egrep -v ${EXL_DB}|awk '{print $NF}'|sed -e 's/ora_pmon_//g'|grep -v sed|grep -v "s///g" )
   do
                integ='^+$'
                if ! [[ ${REPLY} =~ ${integ} ]] || [ ${REPLY} -gt ${INS_COUNT} ]
                        then
                        echo
                        echo "Error: Not a valid number!"
                        echo
                        echo "Enter a valid NUMBER from the displayed list !: i.e. Enter a number from "
                        echo "-----------------------------------------------"
                else
                        export ORACLE_SID=$DB_ID
                        echo
                        printf "`echo "Selected Instance: ["` `echo -e "\033"`\n"
                                                sleep 2
                        echo
                        break
                fi
   done

fi
# Exit if the user selected a Non Listed Number:
      if [ -z "${ORACLE_SID}" ]
         then
          echo "You've Entered An INVALID ORACLE_SID"
          exit
      fi


# #########################
# Getting ORACLE_HOME
# #########################
ORA_USER=`ps -ef|grep ${ORACLE_SID}|grep pmon|grep -v grep|egrep -v ${EXL_DB}|grep -v "\-MGMTDB"|awk '{print $1}'|tail -1`
USR_ORA_HOME=`grep -i "^${ORA_USER}:" /etc/passwd| cut -f6 -d ':'|tail -1`

# SETTING ORATAB:
if [ -f /etc/oratab ]
then
ORATAB=/etc/oratab
export ORATAB
## If OS is Solaris:
elif [ -f /var/opt/oracle/oratab ]
then
ORATAB=/var/opt/oracle/oratab
export ORATAB
fi

# ATTEMPT1: Get ORACLE_HOME using pwdx command:
export PGREP=`which pgrep`
export PWDX=`which pwdx`
if [[ -x ${PGREP} ]] && [[ -x ${PWDX} ]]
then
PMON_PID=`pgrep-lf _pmon_${ORACLE_SID}|awk '{print $1}'`
export PMON_PID
ORACLE_HOME=`pwdx ${PMON_PID}|awk '{print $NF}'|sed -e 's/\/dbs//g'`
export ORACLE_HOME
fi

# ATTEMPT2: If ORACLE_HOME not found get it from oratab file:
if [ ! -f ${ORACLE_HOME}/bin/sqlplus ]
then
## If OS is Linux:
if [ -f /etc/oratab ]
then
ORATAB=/etc/oratab
ORACLE_HOME=`grep -v '^\#' ${ORATAB} | grep -v '^$'| grep -i "^${ORACLE_SID}:" | perl -lpe'$_ = reverse' | cut -f3 | perl -lpe'$_ = reverse' |cut -f2 -d':'`
export ORACLE_HOME

## If OS is Solaris:
elif [ -f /var/opt/oracle/oratab ]
then
ORATAB=/var/opt/oracle/oratab
ORACLE_HOME=`grep -v '^\#' ${ORATAB} | grep -v '^$'| grep -i "^${ORACLE_SID}:" | perl -lpe'$_ = reverse' | cut -f3 | perl -lpe'$_ = reverse' |cut -f2 -d':'`
export ORACLE_HOME
fi
fi

# ATTEMPT3: If ORACLE_HOME is in /etc/oratab, use dbhome command:
if [ ! -f ${ORACLE_HOME}/bin/sqlplus ]
then
ORACLE_HOME=`dbhome "${ORACLE_SID}"`
export ORACLE_HOME
fi

# ATTEMPT4: If ORACLE_HOME is still not found, search for the environment variable:
if [ ! -f ${ORACLE_HOME}/bin/sqlplus ]
then
ORACLE_HOME=`env|grep -i ORACLE_HOME|sed -e 's/ORACLE_HOME=//g'`
export ORACLE_HOME
fi

# ATTEMPT5: If ORACLE_HOME is not found in the environment search user's profile:
if [ ! -f ${ORACLE_HOME}/bin/sqlplus ]
then
ORACLE_HOME=`grep -h 'ORACLE_HOME=\/' ${USR_ORA_HOME}/.bash_profile ${USR_ORA_HOME}/.*profile | perl -lpe'$_ = reverse' |cut -f1 -d'=' | perl -lpe'$_ = reverse'|tail -1`
export ORACLE_HOME
fi

# ATTEMPT6: If ORACLE_HOME is still not found, search for orapipe:
if [ ! -f ${ORACLE_HOME}/bin/sqlplus ]
then
        if [ -x /usr/bin/locate ]
       then
ORACLE_HOME=`locate -i orapipe|head -1|sed -e 's/\/bin\/orapipe//g'`
export ORACLE_HOME
        fi
fi

# TERMINATE: If all above attempts failed to get ORACLE_HOME location, EXIT the script:
if [ ! -f ${ORACLE_HOME}/bin/sqlplus ]
then
echo "Please export ORACLE_HOME variable in your .bash_profile file under oracle user home directory in order to get this script to run properly"
echo "e.g."
echo "export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1"
exit
fi

# Neutralize login.sql file:
# #########################
# Existance of login.sql file under current working directory eliminates many functions during the execution of this script:

      if [ -f ./login.sql ]
         then
mv ./login.sql   ./login.sql_NeutralizedBy${SCRIPT_NAME}
      fi
               
# CSS LOGO函数
function csslogo {
echo -e "\033[31m*************************************************************************************************************************\033[0m"
echo
echo -e "                                          \033[31m ${bold}ORACLE CSS DATABASE TOOLBOX\033[0m                                          "
echo
echo -e "\033[31m b\033[0m: back to aboove menu                                                                                                "
echo -e "\033[31m q\033[0m: exit the program                                                                                                   "
echo -e "\033[31m*************************************************************************************************************************\033[0m"
}

# 一级菜单
function menu1() {
    clear
        csslogo
    echo "=== 一级菜单 ==="
    echo "1. 数据库运行状况检查"
        echo "2. 数据库空间状况检查"
        echo "3. 数据库dataguard检查"
        echo "4. 数据库运行状况检查"
        echo "5. 数据库运行状况检查"
        echo "6. 数据库运行状况检查"
    echo "================"
    read -p $'\e\033[33;5m$请输入选项:\e\033[0m' choice

    case $choice in
      1)
            menu21;;
      q)
            exit;;
      *)
            echo "无效的选项!"
            sleep 1
            menu1;;
    esac
}

# 二级菜单
function menu21() {
    clear
        csslogo
    echo "=== 二级菜单 ==="
    echo "1. 进入三级菜单31"
    echo "================"
    read -p $'\e\033[33;5m$请输入选项:\e\033[0m' choice

    case $choice in
      1)
            menu31;;                       
      b)
            menu1;;
      q)
            exit;;
      *)
            echo "无效的选项!"
            sleep 1
            menu2;;
    esac
}

# 三级菜单
function menu31() {
    while true; do
      clear
                csslogo
      echo "=== 三级菜单 ==="
      echo "1. 执行命令1"
      echo "2. 执行命令2"
      echo "================"
      read -p $'\e\033[33;5m$请输入选项:\e\033[0m' choice

      case $choice in
            1)        echo "commond1 execute successly"
                # 在这里添加你想要执行的命令,例如:
                # command
                read -p "命令执行完毕,按任意键继续..."
                ;;

            2)        echo "commond2 execute successly"
                # 在这里添加你想要执行的命令,例如:
                # command
                read -p "命令执行完毕,按任意键继续..."
                ;;
                        b)
                menu21;;
            q)
                exit;;
            *)
                echo "无效的选项!"
                sleep 1;;
      esac
    done
}

# 主程序入口
menu1


页: [1]
查看完整版本: shell 3级菜单案例