shell 函数

1.如何定义函数和调用函数

fun01 () { echo "Hello World"; } 
fun01

2.如何给函数传递一个参数

fun01 () { echo "Hello $1"; } 
fun01 SHell			#执行时跟上一个固定的参数
fun01 $1			#执行时跟上一个不固定的参数    (脚本的位置参数,需要执行脚本时传递)

3.函数接收N多个参数传递

fun01 () { echo "Hello $*"; } 
fun01 liunx shell  Python  Test

4.函数传参

第一种方式
	fun01 () {
		echo "Hello $1"
	}

#脚本的位置参数
fun01 $1

需求1,写一个脚本,该脚本可以实现计算器的功能,可以进行 +- * / 四种计算。

例如: sh cal.sh 30 + 40 | sh cal.sh 30 - 40 | sh cal.sh 30 * 40 | sh cal.sh 30 / 40
[root@manager functions]# cat fun02.sh 
fun () {
	case $2 in
		+)
			echo $1 + $3 = $[ $1 + $3 ]
			;;
		-)
			echo $1 - $3 = $[ $1 - $3 ]
			;;
		x)
			echo $1 x $3 = $[ $1 * $3 ]
			;;		
		/)
			echo $1 / $3 = $[ $1 / $3 ]
			;;
	esac
}
	fun $1 $2 $3

需求2:写一个脚本,实现nginx服务的启动、停止、重启 (简单实现,在判断阶段使用函数来做。)

1.先实现启动和停止
2.在优化脚本
[root@manager functions]# cat fun05.sh 
#!/bin/bash

Author:      Oldux.com QQ: 552408925

Date:       2019-11-04

FileName:   fun05.sh

Description: 

ngx_status=$1

nginx_is_status () {

systemctl $ngx_status nginx
if [ $? -eq 0 ];then
	echo "nginx is $ngx_status"
else
	echo "nginx is $ngx_stauts err"
	exit 1
fi

}

case $ngx_status in
	start)
		nginx_is_status
		;;

stop)
	nginx_is_status
;;
*)
	echo "USAGE: $0 { start | stop | restart }"
	exit

esac

函数实例脚本: echo

echo "The 1 user is : root"
echo "The 2 user is : bin"

[root@manager functions]# cat fun06.sh 
#!/bin/bash

Date:       2019-11-04

FileName:   fun06.sh

Description: 

get_users () {
	user=$(awk -F ":" '{print $1}' /etc/passwd)
	echo $user
}

#将函数输出的结果,从新赋值给user_list变量存储起来
user_list=$(get_users)

index=1
for u in ${user_list}
do
	echo "The $index user is : $u"
	let index++
done

函数实例脚本: return

函数实例脚本: return

[root@manager functions]# cat fun07.sh 
#!/bin/bash

Date:       2019-11-04

FileName:   fun07.sh

Description: 

file=$1            #定义文件

t_file(){                   #函数判断
    if [ -f $file ];then
        return 0
    else
        return 1
    fi
}

$?
t_file
rc=$?

if [ $rc -eq 0 ];then
	echo "该文件存在 $file"
else
	echo "该文件不存在 $file"

fi
[root@manager functions]# cat fun08.sh 
#!/bin/bash

Date:       2019-11-04

FileName:   fun08.sh

Description: 

fun () {
	systemctl status nginx &>/dev/null

if [ $? -eq 0 ];then
	return 0
else
	return 100
fi

}
fun
echo $?

retrun: 主要控制函数的返回值   可以理解是命令执行后的结果
echo:  主要控制函数的返回数据
[root@manager functions]# cat fun09.sh 
#!/bin/bash

Date:       2019-11-04

FileName:   fun09.sh

Description: 

#根据用户传递的服务名称,获取不同服务的状态
is_server_running(){
	systemctl status $1 &>/dev/null
    if [ $? -eq 0 ];then
        return 0
    else
        return 1
    fi
}
#调用函数,并根据函数返回状态码进行输出
is_server_running $1 && echo "$1 is Running" || echo "$1 is stoped

需求3:使用函数、循环、case实现系统管理工具箱。

Command action
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
[root@manager functions]# cat fun10.sh 
#!/bin/bash

Date:       2019-11-04

FileName:   fun10.sh

Description: 

meminfo () {

cat <<-EOF

Command action
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序

---------------------------

EOF
}
	meminfo

while true
do
	read -p "请输出你要选择选项: " Action
	case $Action in 
		h)
			help
			;;
		f)
			lsblk
			;;
		d)
			df -h
			;;
		m)
			free -m
			;;
		u)
			uptime
			;;
		q)
			exit
			;;
		*)
			continue

esac

done

需求4:使用case、循环、函数、实现JumpServer跳板机功能。

1.用户登陆该服务器则自动执行该脚本。 pass
2.脚本提示可连接主机列表。
3.该脚本无法直接退出。		pass
[root@manager functions]# cat fun11.sh 
#!/bin/bash

Date:       2019-11-04

FileName:   fun11.sh

Description: 

meminfo(){

​        cat <<-EOF

​        |       1) lb01-172.16.1.5      |
​        |       2) lb02-172.16.1.6      |
​        |       3) web01-172.16.1.7     |
​        |       4) web02-172.16.1.8     |

​        |       h) help                 |

​	EOF
}
​	meminfo
​	trap "" HUP INT TSTP

while true
do
	read -p "请输入你要登录的主机: " Action
	

case $Action in
	1|lb01)
		ssh root@172.16.1.5
	;;
	2|lb02)
		ssh root@172.16.1.6
	;;
	3|web01)
		ssh root@172.16.1.7
	;;
	4|web02)
		ssh root@172.16.1.8
	;;
	h)
		clear
		meminfo
	;;
	exec)
		exit
		;;
	*)
		continue
esac

done

需求5.case场景示例,实现多级菜单功能,需要使用到函数、case、循环、if判断、变量

[root@ansible ~]# cat file25.sh 
#!/bin/bash
menu() {

cat <<EOF

菜 	单

(1) Install Nginx
(2) Install Mysql
(3) Install PHP

(4) quit

EOF
}
menu2(){

cat <<EOF

版本

(1) Install Nginx1.1
(2) Install Nginx1.2
(3) Install Nginx1.3

(4) 返回上一级

EOF
}
menu3(){

cat <<EOF

版本

(1) Install mysql1.1
(2) Install mysql1.2
(3) Install mysql1.3

(4) 返回上一级

EOF
}
menu4(){

cat <<EOF

版本

(1) Install php1.1
(2) Install php1.2
(3) Install php1.3

(4) 返回上一级

EOF
}
while true
do
menu
read -p "请选择服务" Action
case $Action in
(1)
menu2
while true
do
read -p "请选择你的版本" Action1
case $Action1 in
(1)
echo -e "\033[35m nginx 1.1 is done\033[0m"
sleep 1
echo -e "\033[35m nginx 1.1 is ok\033[0m"
;;
(2)
echo -e "\033[35m nginx 1.2 is done\033[0m"
sleep 1
echo -e "\033[35m nginx 1.2 is ok\033[0m"
;;
(3)
echo -e "\033[35m nginx 1.3 is done\033[0m"
sleep 1
echo -e "\033[35m nginx 1.3 is ok\033[0m"
;;
(4)
clear
break
esac
done
;;
(2)
menu3
while true
do
read -p "请选择你的版本" Action1
case $Action1 in
(1)
echo -e "\033[35m mysql 1.1 is done\033[0m"
sleep 1
echo -e "\033[35m mysql 1.1 is ok\033[0m"
;;
(2)
echo -e "\033[35m mysql 1.2 is done\033[0m"
sleep 1
echo -e "\033[35m mysql 1.2 is ok\033[0m"
;;
(3)
echo -e "\033[35m mysql 1.3 is done\033[0m"
sleep 1
echo -e "\033[35m mysql 1.3 is ok\033[0m"
;;
(4)
clear
break
esac
done
;;
(3)
menu4
while true
do
read -p "请选择你的版本" Action1
case $Action1 in
(1)
echo -e "\033[35m php 1.1 is done\033[0m"
sleep 1
echo -e "\033[35m php 1.1 is ok\033[0m"
continue
;;
(2)
echo -e "\033[35m php 1.2 is done\033[0m"
sleep 1
echo -e "\033[35m php 1.2 is ok\033[0m"
;;
(3)
echo -e "\033[35m php 1.3 is done\033[0m"
sleep 1
echo -e "\033[35m php 1.3 is ok\033[0m"
;;
(4)
clear
break
esac
done
;;
(4)
exit
;;
(*)
clear
continue
esac
done
posted @ 2019-11-04 19:34  爱可耐  阅读(255)  评论(0编辑  收藏  举报