shell-case语句-函数

1.shell函数

1.1 函数的作用

1.命令合集,完成特定功能的代码块
2.在shell中定义函数可以使用代码模块化, 便于复用代码,加强可读性
3.函数和变量类似, 先定义才可调用,如果定义不调用则不会被执行

1.2 函数的语法介绍

推荐使用第三种

function 函数名() {
        指令集.....        
}

function 函数名 {
        指令集.....        
}

函数名() {
        指令集.....        
}

1.3 简单实践

调用函数非常简单, 只需要在脚本中写入函数的名称即可
简单函数

haoge() { 
    echo "I am boy." 
} 
function yuyu { 
    echo "I am girl." 
} 
test() { 
    echo "Hello world." 
} 
oldboy 
oldgirl 

带参数的函数编写执行

[root@shell scripts]# cat test.sh
#!/bin/sh
haoge() {
    echo "I am $1"
}
haoge haoge
[root@shell scripts]# sh test.sh
I am haoge

将脚本传参转为函数传参

$1  传入脚本后第一个参数
$1 在函数中表示函数的传参,在函数外表示脚本的传参,可以将脚本传参转为函数传参
[root@shell scripts]# cat test.sh
#!/bin/sh
haoge() {
    echo "I am $1"
}
haoge $1
[root@shell scripts]# sh test.sh haoge
I am haoge
[root@shell scripts]# cat test.sh 
#!/bin/sh
sum(){
a=0
num=$1
for i in `seq $num`
do
        a=$[ $i + $a ]

done
        echo "计算结果是: $a"
}
sum $1
sum $2
sum $3
[root@shell scripts]# sh test.sh 10 20 30
计算结果是: 55
计算结果是: 210
计算结果是: 465

函数的状态值
return 返回指定函数退出状态码

[root@shell scripts]# cat test.sh
#!/bin/sh
fun2() {
echo 100
return 1
}
fun2
echo "函数的状态码是: $?"
[root@shell scripts]# sh test.sh
100
函数的状态码是: 1

1.4 系统自带函数库

/etc/rc.d/init.d/functions
系统本身会有自带的函数,我们也可以将自己定义的函数加到/etc/rc.d/init.d/functions中,在脚本中想使用/etc/rc.d/init.d/functions中的函数时只需要加载一下就可以啦

要在文件结尾strstr上面添加自己的函数
[root@shell scripts]# tail  /etc/rc.d/init.d/functions
    fi
fi
haoge(){
    echo "I am $1"
}
strstr "$(cat /proc/cmdline)" "rc.debug" && set -x
return 0

测试一下
[root@shell scripts]# cat test.sh 
#!/bin/sh
source /etc/rc.d/init.d/functions
haoge $1
[root@shell scripts]# sh test.sh haoge
I am haoge

1.5 练习:通过脚本传参的方式,检查 Web 网站 URL 是否正常

测试语句
wget --spider -T 5 -q -t 2 www.baidu.com

简单版 不用函数

[root@shell scripts]# cat test.sh
#!/bin/sh
if [ $# -ne 1 ]
then
    echo "Usage:$0 url"
    exit 1
fi
wget --spider -t 2 -T 3 -q $1 &>/dev/null
if [ $? -eq 0 ]
then
    echo "$1 is ok"
else
    echo "$1 is fail"                                                                                   
fi 
[root@shell scripts]# sh test.sh 1
1 is fail
[root@shell scripts]# sh test.sh 1 2
Usage:test.sh url
[root@shell scripts]# sh test.sh www.baidu.com
www.baidu.com is ok

精确判断网址(引入系统 action 函数库)

[root@shell scripts]# cat test.sh
#!/bin/sh
source /etc/rc.d/init.d/functions
usage(){
    echo "Usage:$0 url"
    exit 1
}

check_para(){
    if [[ $1 =~  http://www.* ]]     
    then
        :
    else
        echo "地址必须以 http://www开始"
        exit 2
    fi
}

check_url(){
    wget --spider -t 2 -T 3 -q $1 &>/dev/null
    if [ $? -eq 0 ]
    then
        action "$1 is ok" /bin/true
    else
        action "$1 is fail" /bin/false
    fi
}

main(){                 #<---主函数
    if [ $# -ne 1 ]
    then
        usage
    fi
    check_para $1
    check_url $1
}
main $*

测试一下

[root@mongodb scripts]# sh test.sh 114.114.114.114
地址必须以 http://www开始
[root@mongodb scripts]# sh test.sh www.baidu.com
地址必须以 http://www开始
[root@mongodb scripts]# sh test.sh http://www.baidu.com
http://www.baidu.com is ok                                 [  确定  ]

2. case结构条件句

2.1 case语句格式

case 变量 in 
模式 1) 
    命令序列 1;; 
模式 2) 
    命令序列 2;; 
模式 3) 
    命令序列 3 ;; 
*) 
    无匹配后命令序列 
esac

中文形象语法

case "找老婆条件" in
家里有房子) 
                  嫁给你
                  ;;
家庭有背景)
                  嫁给你
                  ;;
很努力工作)
                  先交往
                  ;;
*)         
                 再见!
esac

2.2 练习

简单练习
执行Shell脚本,打印一个如下的水果菜单:
1.apple
2.pear
3.banana
4.cherry

cat <

输出下面菜单
1.install MySQL
2.install Tomcat
3.exit
当用户选择对应的数字就开始安装对应的服务(可用echo输出安装提示替代),需要对用户输入的数字进行判断是否为整数。

echo '1.install MySQL
2.install Tomcat
3.exit'
read -p "请选择一个数字:" num
[ -z "$num" ] && exit 1

expr $num + 99 &>/dev/null
if [ $? -ne 0 ]
then
    echo "请输入整数"
    exit
fi

case "$num" in
    1)
        echo "install MySQL"
        ;;
    2)
        echo "install Tomcat"
        ;;
    3)
        echo bye
        exit 1
        ;;
    *)
        echo "别瞎逼输入,请输入{1|2|3}"
esac 

2.3 字体跟背景颜色

字体颜色
echo -e "\033[30m 黑色字haoge trainning \033[0m" #<==30m表示黑色字。
echo -e "\033[31m 红色字haoge trainning \033[0m" #<==31m表示红色字。
echo -e "\033[32m 绿色字haoge trainning \033[0m" #<==32m表示绿色字。
echo -e "\033[33m 棕色字haoge trainning \033[0m" #<==33m表示棕色字(brown),和黄色字相近。
echo -e "\033[34m 蓝色字haoge trainning \033[0m" #<==34m表示蓝色字。
echo -e "\033[35m 洋红字haoge trainning \033[0m" #<==35m表示洋红色字(magenta),和紫色字相近。
echo -e "\033[36m 蓝绿色haoge trainning \033[0m" #<==36m表示蓝绿色字(cyan),和浅蓝色字相近。
echo -e "\033[37m 白色字haoge trainning \033[0m" #<==37m表示白色字。 
背景颜色
echo -e "\033[40;37m 黑底白字haoge\033[0m"   #<==40m表示黑色背景。
echo -e "\033[41;37m 红底白字haoge\033[0m"   #<==41m表示红色背景。
echo -e "\033[42;37m 绿底白字haoge\033[0m"   #<==42m表示绿色背景。
echo -e "\033[43;37m 棕底白字haoge\033[0m"   #<==43m表示棕色背景(brown),和黄色背景相近。
echo -e "\033[44;37m 蓝底白字haoge\033[0m"   #<==44m表示蓝色背景。
echo -e "\033[45;37m 洋红底白字haoge\033[0m"  #<==45m表示洋红色背景(magenta),和紫色背景相近。
echo -e "\033[46;37m蓝绿底白字haoge\033[0m"   #<==46m表示蓝绿色背景(cyan),和浅蓝色背景相近。
echo -e "\033[47;30m 白底黑字haoge\033[0m"    #<==47m表示白色背景。 

2.4 案例 jumpserver简单实现

trap命令

信号说明
HUP(1)    挂起,通常因终端掉线或用户退出而引发
INT(2)    中断,通常因按下Ctrl+C组合键而引发
QUIT(3)  退出,通常因按下Ctrl+组合键而引发
ABRT(6)  中止,通常因某些严重的执行错误而引发
ALRM(14)  报警,通常用来处理超时
TERM(15)  终止,通常在系统关机时发送
SIGTSTP   停止进程     终端来的停止信号
[root@shell ~]# cat /server/scripts/jumpserver.sh 
#!/usr/bin/bash

#jumpServer 

Mysql=10.0.0.10
Nginx=10.0.0.6
Nginx1=10.0.0.7
Nginx2=10.0.0.8

meminfo(){
cat <<-EOF
-------------------------------
|       1) mysql                |
|       2) Nginx                |
|       3) Nginx1               |
|       4) Nginx2               |
|       h) help                 |
---------------------------------
EOF
}
        #调用函数打印菜单
        meminfo
        #控制不让输入ctrl+c,z;可以省略
        trap "" HUP INT TSTP
while true
do
        read -p "请输入要连接的主机编号: " num
        case $num in 
                1|mysql)      #<---- 符号|表示或者
                        ssh root@$Mysql
                        ;;
                2|nginx)
                        ssh root@$nginx
                        ;;
                3|nginx)
                        ssh root@$nginx1
                        ;;
                h|help)
                        clear
                        meminfo
                        ;;
                exec)
                        break
                        ;;
        esac
done

你可能感兴趣的:(shell-case语句-函数)