shell脚本case菜单&函数 | |
作用 | 使用case语句改写if多分支可以使脚本结构更加清晰、层次分明。针对变量的不同取值,执行不同的命令序列。 |
特点 | case没有优先级,输入那个就调用哪个 |
结构 | case 变量值 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; *) 默认命令序列 esac |
示例 |
|
小实验 | 设置一个脚本文件,将其添加到chkconfig中,使用chkconfig命令可以看到它在服务列表中。 |
编写一个脚本 | |
PS | # chkconfig:35 81 31 此处的#并非注释,而是让chkconfig可以识别后面的内容。 35为启动模式,3模式和5模式;“-”表示所有启动级别都不默认开启。 81为此程序是第81个开启的程序 31为此程序是第31个关闭的程序 |
[root@centos mulu]# chmod +x /etc/init.d/qidong.sh 为文件添加执行权限,让其可以使用路径执行 | |
[root@centos mulu]# chkconfig --add /etc/init.d/qidong.sh 将qidong.sh添加到启动服务中,就可以使用chkcofig查看服务 | |
优化脚本
. /etc/init.d/functions为调用functions库。(下面的为软链接) action 也是输出的意思,类似于echo,但功能略有不同 /bin/true显示效果为OK,/bin/false显示效果为FAILED | |
我的shell为中文的,所以显示的是失败和确定。 | |
函数 | |
作用 | 将命令格式写在一起,可方便重复使用命令序列 |
格式 | [ function ] 函数名(){ 命令序列 [ return x ] } |
调用函数 | 函数名 [ 参数1 ] [ 参数2 ] return:跳出整个函数体 continue:临时终止本次循环 break:直接终止整个循环(终止离他最近的循环,外部循环与他无关) exit:直接终止整个脚本 |
例子 | 函数名不需要加$,封装的过程为函数,每引用一次函数的名字,就会执行一遍过程。 |
例子 |
将函数先进行定义好,然后用循环包含菜单,每执行一条匹配的内容,就会走一遍流程,直到退出。 |
解析 | clear清屏,然后调用Title函数,中的内容,用户输入的内容赋值给Choose,Choose值为1的话,会去调用Login函数中的匹配项;Choose值为2的话,会调用Exit函数中的选项,从而退出脚本;如果Choose值既不是1也不是2的话,会在桌面显示sb,然后两秒后清屏再次进入循环。 |
练习 | |
题目 | |
代码 | #!/bin/bash User1=root Passwd1=abc123, User2=xiaofa Passwd2=123123 Lock="" function Login(){ read -p "请输入用户名:" user echo $Lock | grep -w "$user" &>/dev/null [ $? -eq 0 ] && echo "账号被锁定,请登录其他账户" && sleep 2 && return if [ $user != $User1 -a $user != $User2 ]; then echo "用户名输入有误!" sleep 2 return fi for i in 3 2 1 do read -p "您还有$i次尝试次数,请输入$user用户的密码:" passwd if [ $passwd == $Passwd1 -a $user == $User1 ]; then echo "$user用户登陆成功,程序退出" exit 0 elif [ $passwd == $Passwd2 -a $user == $User2 ]; then echo "$user用户登录成功,程序退出" exit 0 fi done echo "$user用户的密码已经输错3次,账户已经被锁定" Lock=$Lock"$user" sleep 2 } function Title(){ cat <<FOF ********************** 1.登录 2.退出 ********************** FOF read -p "请输入你的选择:" Choose } function Exit(){ echo "程序退出" exit } while : do clear Title case $Choose in 1) Login ;; 2) Exit ;; *) echo "sb" sleep 2 ;; esac done |
解析 | |
效果 |
|