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 <<EOF
1.apple
2.pear
3.banana
4.cherry
EOF
read -p "请选择一个数字:" num
case "$num" in
    1)
        echo "apple"
        ;;
    2)
        echo "pear"
        ;;
    3)
        echo "banana"
        ;;
    4)
        echo "cherry"
        ;;
    *)
        echo "请不要瞎输入,选择{1|2|3|4}"
        exit 1
esac

输出下面菜单
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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容