shell 函数

和自甴很熟 提交于 2019-12-03 11:34:39

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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!