1.9.1 实例需求
用户在进行Linux系统管理的过程中,经常需要用到查看进程的信息、用户的信息等常用的功能。本例针对这一需求,使用shell编程实现基本的系统管理 功能。通过本程序,可以按照要求实现查看进程信息、查看当前登录系统的用户信息等功能。程序主界面颜色可以更改,也可以显示帮助信息。
1.9.2 系统设计
根据需求,首先考虑到界面的美观性,将主界面设计为菜单形式。个系统管理功能作为其中的一个菜单项。当用户选择某项功能后,则执行相应的代码段完成功能并输出。输出结束后再返回主菜单,供用户继续选择。流程图如图1-1所示。
1.9.3 程序代码
按照上述设计思想,程序可以划分为几个模块:界面修改模块、主菜单模块、查看进程信息模块、查看用户信息模块和帮助模块。程序代码如下:
#############################################################
#界面修改模块:color函数
#根据输入颜色信息修改界面颜色
color()
{
case $1 in
black_green) #黑底绿字
echo -e "\033[40;32m"
;;
black_yellow) #黑底黄字
echo -e "\033[40;33m"
;;
black_white) #黑底白字
echo -e "\033[40;37m"
;;
black_blue) #黑底蓝字
echo -e "\033[40;34m"
;;
*) #默认为黑底白字
echo -e "\033[30;37m"
;;
esac
}
#############################################################
#主菜单模块
#清屏
echo -e "\033[2J"
#设置信号处理
trap "" 1 2 3
#日期信息
date=`date +%d/%m/%y`
#机器名信息
host=`hostname`
#当前用户信息
user=`whoami`
#循环显示主菜单
while :
do
#显示主菜单,menu作为cat命令的结束符
cat <<menu
---------------------------------------------------
$user $host $date
---------------------------------------------------
1:改变字体颜色
2:查看进程信息
3:查看用户信息
h:帮助
q:退出
---------------------------------------------------
menu
#cat命令结束
#提示用户输入选项
echo -e -n "\t请输入您的选择【1,2,3,h,q】:"
#读取用户输入的选择项
read choice
#判断choice值
case $choice in
1) #用户输入1
#while循环,接收用户输入的颜色选择
while :
do
#显示颜色选择菜单
cat <<menu_color
---------------------------------------------------
$user $host $date
---------------------------------------------------
1:黑绿 2:黑黄 3:黑白 4:黑蓝 0:返回
---------------------------------------------------
menu_color
#cat命令结束
#提示用户输入颜色选项
echo -e -n "\t请输入选择的颜色【1,2,3,4,0】:"
#读取用户的输入
read choice_color
#判断用户输入的颜色选项
case $choice_color in
1) #用户输入1
#调用color函数设置颜色
color black_green
;;
2) #用户输入2
#调用color函数设置颜色
color black_yellow
;;
3) #用户输入3
#调用color函数设置颜色
color black_white
;;
4) #用户输入4
#调用color函数设置颜色
color black_blue
;;
0) #用户输入0
#退出当前菜单
break
;;
*) #用户输入其它任意值
#输入错误,清屏继续等待输入
echo -e "\033[2J"
echo -e "\tInput error! Please input again!"
continue
;;
#case结束
esac
clear
#while结束
done
;;
#############################################################
#查看进程信息模块
2) #用户输入2
#调用ps命令查看进程信息
ps aux|sort -m|head -10
;;
#############################################################
#查看用户信息模块
3) #用户输入3
#调用who命令查看用户信息
who
;;
#############################################################
#帮助模块
H|h) #用户输入H或h
#调用cat显示帮助信息
cat <<menu_help
选择“改变字体颜色“可以修改当前界面的字体颜色
选择“查看进程信息“可以获取当前占用资源最高的前10个进程
选择“查看用户信息“可以获取当前登录系统的用户信息
menu_help
#cat命令结束
;;
Q|q) #用户输入Q或q
#推出主程序
exit 0
;;
*) #用户输入其他值
#输入错误,清屏继续等待输入
echo -e "\033[2J"
echo -e "\tInput error! Please input again!"
continue
;;
#case语句结束
esac
#执行完命令后的提示
echo -e -n "\t按任意键继续..."
read anykey
clear
#while循环结束
done
[root@250-shiyan prog]# cat menu #!/bin/bash #### color() { case $1 in black_green) echo -e "\033[40;32m" ;; black_yellow) echo -e "\033[40;33m" ;; black_white) echo -e "\033[40;37m" ;; black_blue) echo -e "\033[40;34m" ;; *) echo -e "\033[30;37m" ;; esac } #### echo -e "\033[2j" trap "" 1 2 3 date=`date +%d/%m/%y` host=`hostname` user=`whoami` #### while : do cat <<menu ------------------------------------------------- $user $host $date ------------------------------------------------- 1:change font color 2:view process info 3:view user info h:help q:quit ------------------------------------------------- menu echo -en "please input choice [1,2,3,h,q]:" read choice case $choice in 1) #### while : do cat <<menu_color ************************************************* $user $host $date ************************************************* 1:black_green 2:balck_yellow 3:black_white 4:black_blue 0:back ************************************************* menu_color echo -ne "please input color [1,2,3,4,0]:" read color case $color in 1) color black_green;; 2) color black_yellow;; 3) color black_white;; 4) color black_blue;; 0) break;; *) echo -e "\033[2j" echo -e "input error! please input again!" continue ;; esac clear done ;; #### 2) ps aux|sort -m|head -10 ;; 3) who ;; H|h) cat <<menu_help select1 "change font color" can alert current UI's color select1 "view ps info" can view ps info select1 "view user info" can view user info menu_help ;; Q|q) exit 0 ;; *) echo -e "\033[2j" echo -e "input error! please input again!" continue ;; esac echo -ne "please press any key to continue" read anykey clear done [root@250-shiyan prog]#
shell菜单样例 #!/bin/sh #menu #set the date,user and hostname up MYDATE=`date +%d/%m/%Y` THIS_HOST=`hostname -s` USER=`whoami` PWD=`pwd` trap "" 2 3 15 ####colour function colour () { case $1 in black_green) echo -e '\033[40;32m' ;; black_yellow) echo -e '\033[40;33m' ;; black_white) echo -e '\033[40;37m' ;; black_cyan) echo -e '\033[40;36m' ;; red_yellow) echo -e '\033[41;33m' ;; esac } #### single key function get_char() { #get_char #save current stty setting SAVEDSTTY=`stty -g` #如果你的机器上不认stty raw那么把函数中两处出现的raw换成cbreak stty cbreak dd if=/dev/tty bs=1 count=1 2>/dev/null stty -cbreak #restore stty stty $SAVEDSTTY } #### while1 function while1() { while [ 1 -gt 0 ] do sleep 3 echo used echo "`free |awk '/Mem/{print $3}'`" done } #### for1 function for1(){ for i in {1,2,3,4} do sleep 3 echo used echo "0:`free |awk '/Mem/{print $3}'`:freeeeeeeee" done } #### while2 function while2 () { min=1 max=100 while [ $min -le $max ] do echo $min min=`expr $min + 1` done } #### while3 function while3 () { i=1 while(($i<100)) do if(($i%4==0)) then echo $i fi i=$(($i+1)) done } #loop forever ! while : do # clear the screen tput clear colour black_green # here documents starts here cat <<MAYDAY --------------------------------------------------------------------------- User:$USER Host:$THIS_HOST Date:$MYDATE Pwd:$PWD --------------------------------------------------------------------------- 1 : while1 2 : while2 3 : while3 4 : for1 H : Help screen Q : Exit Menu --------------------------------------------------------------------------- MAYDAY # here document finished colour black_cyan echo -e -n "\tYour Choice [1,2,3,4,H,Q] >" read CHOICE case $CHOICE in 1) while1 ;; 2) while2 ;; 3) while3 ;; 4) echo -e "\e[31mTHIS is source\e[0m" cat <<MAYDAY for1(){ for i in {1,2,3,4} do sleep 3 echo used echo "0:`free |awk '/Mem/{print $3}'`:freeeeeeeee" done } MAYDAY echo -e "\e[31mTHIS is result\e[0m" for1 ;; H|h) cat <<MAYDAY this is the help screen,nothing here yet to help you ! MAYDAY ;; Q|q) exit 0 ;; *) echo -e "\t\041Unknown user response" ;; esac echo -e -n "\tHit the any key to continue" get_char done