shell函数实例

shell函数

shell函数说明

在shell脚本当中,函数的应用是非常常见的,也是很有效的。对于常用的功能,我们可以编写成一个函数,然后自行调用,通过这种方式能提高代码的可读性和整体的关联性。

在linux系统本身的脚本文件中,存在着大量的循环、嵌套、函数的应用,各位可以在了解基本的循环和shell函数语法结构之后,去尝试看看系统文件的脚本编写,有助于提高运维效率。

语法

方法1:

从命令行写shell函数,函数主体中行末需要添加分号";"

[root@m01]#function fun { echo "hello shell"; }
[root@m01]#fun
hello shell
[root@m01]#

方法2:

在脚本中编写shell函数 function func01 { 函数主体 }

[root@python3 func]# sh func_hello.sh 
hello shell
这是我的第一个函数
[root@python3 func]# cat func_hello.sh 
#!/bin/bash
function func01 {
  echo "hello shell"
  echo "这是我的第一个函数"
}
func01
[root@python3 func]# 

方法3:

在脚本中编写shell函数 func01() { 函数主体 }

[root@python3 func]# sh func_hello.sh 
hello shell
这是我的第一个函数
[root@python3 func]# cat func_hello.sh 
#!/bin/bash
func02() {
  echo "hello shell"
  echo "这是我的第二个函数"
}
func02

函数的调用

#将shell函数文件添加到/etc/bashrc文件末尾,然后在命令行直接使用函数名称来调用函数,就像执行系统命令一样,且可以使用$1-$10这样的系统变量。

[root@python3 func]# tail /etc/bashrc 
......
                . "$i" >/dev/null
            fi
        fi
    done

    unset i
    unset -f pathmunge
fi
# vim:ts=4:sw=4
. /root/func/func_hello.sh
[root@python3 func]# . /etc/bashrc
[root@python3 func]# func01 
hello shell
这是我的第一个函数
[root@python3 func]# 

普通脚本中也可以调用定义了函数的库文件,并且在脚本中直接使用该函数库中的所有函数

[root@python3 func]# cat func_hello
func01() {
  echo "hello shell"
  echo "这是我的第一个函数"
}

[root@python3 func]# cat test.sh 
#!/bin/bash

. /root/func/func_hello
func01
[root@python3 func]# sh test.sh 
hello shell
这是我的第一个函数
[root@python3 func]# 

函数的传参

函数的传参和给脚本传参类似,可以直接接受脚本传入的参数,也可直接给函数传参,通过下面的实列说明函数的传参问题

从命令行执行函数,可以像使用linux命令一样,接收参数。

[root@python3 func]# func02 1 4
1 * 4 = 4
[root@python3 func]# cat func_hello
#!/bin/bash

func01() {
  echo "hello shell"
  echo "这是我的第一个函数"
}

function func02 {
 echo "$1 * $2 = $[ $1 * $2 ]" 
}
[root@python3 func]# func02 6 4
6 * 4 = 24
[root@python3 func]# 

在脚本中调用函数库文件,并且执行其中的函数,函数可通过获取而脚本的参数来给自己传参

[root@python3 func]# sh test.sh 4 5
通过在脚本中 test.sh 引入函数库文件,来掉用shell函数
hello shell
这是我的第一个函数
通过调用脚本的参数来传参: 4 5
4 * 5 = 20
调用脚本的变量
[root@python3 func]# cat test.sh 
#!/bin/bash

. /root/func/func_hello

echo "通过在脚本中 $0 引入函数库文件,来掉用shell函数"

func01

echo  "通过调用脚本的参数来传参: $*"

func02  $1 $2
[root@python3 func]# cat func_hello
#!/bin/bash

func01() {
  echo "hello shell"
  echo "这是我的第一个函数"
}

function func02 {
  echo "$1 * $2 = $(($1 * $2))" 
  echo "调用脚本的变量"
}
[root@python3 func]# 

shell函数应用

跳板机

#!/bin/bash
hostlist(){

	echo "散列主机:"
	echo -e "\t<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
	while read line
	do
		echo -e "\t|        "$line
	done<hostlist.txt
	echo -e "\t>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"
}

memuinfo(){
cat <<EOF
        ---------------------------------
        |       1) 主机目录             |
        |       2) 使用手册             |
        |       3) 远程登陆             |
        |       h) help                 |
        ---------------------------------
EOF
}
OperInst(){
cat <<EOF
#本次跳板机只是引用shell函数做的小实验,请勿太在意其实用性,操作说明如下:
#1.主机列表在单独的一个文件中,通过一个函数来读取文件内容,并打印在屏幕中,提供管理员一个简单手抄作用
#2.使用手册简单的对jumphost.sh脚本的执行过程和功能做简单的介绍
#3.此脚本的主要功能就是通过SSH远程登陆已经对该跳板机免密登陆的主机
#4.如果您的操作出现了异常情况,请输入"h"来获得答案
#
#脚本功能说明:
#1.本次实验会更多的通过函数的调用的方式来完成各项功能,体现shell函数在shell脚本中的作用,比如:
#hostlist:     表示主机列表
#memuinfo:      功能菜单
#OperInst:     调用您看到的功能说明
#Help:          帮助你退出无聊的循环单中
EOF
}

Login(){
read -p $'请输入您需要远程的主机IP地址\n#'  IP
read -p "user login:" User
read  -s -p "password:" Pass
sshpass -p $Pass ssh $User@$IP -o StrictHostKeyChecking=no
}

Help(){
echo "欢迎您不厌其烦的来到这里,我来帮助你退出无聊的程序"
Mail=$(rpm -qa |grep mailx;echo $?)
if [ $Mail -ne 0 ]
then
	echo "安装mail插件中..."
	yum -y install mailx
	read -p $'请输入您对该脚本的意见和建议\n>>>' text
	echo $text|mail -s test [email protected]
	exit
else
	read -p $'请输入您对该脚本的意见和建议\n>>>' text
	echo $text|mail -s test [email protected]
	exit
fi
}

sshpass_install(){
num=$(rpm -qa |grep "sshpass";echo $?)
if [ $num -ne 0 ]
then
echo "正在安装所需要的插件: sshpass"
yum -y install sshpass
fi
}

	memuinfo
	trap "" HUP INT TSTP
while true
do
        read -p "请选择目录中的功能{ 1 | 2 | 3 | h }: " action
	case $action in
		3)
			sshpass_install
			read -p "您已经选择执行远程连接{ yes | no }" action
			
			if [ $action == "yes"  ];then
				Login
			fi
       			continue
		;;
		2)
			clear
			OperInst
			echo -e "\n"
			memuinfo
		;;
		1)
			clear
			hostlist
			echo -e  "\n"
			memuinfo
		;;
		h)
			Help
			echo -e "\n"
			memuinfo
		;;
		exec)
			exit
		;;
		*)
			continue
	esac

done

#主机列表文件:hostlist.txt,请自行编写一个主机列表文件

忠告:shell脚本如果需要数量掌握,离不开您对linux命令的熟悉,该怎么做你懂的,加油!
在此欢迎您发表您的看法,咱们一起学习。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章