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