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 13146156766@126.com
exit
else
read -p $'请输入您对该脚本的意见和建议\n>>>' text
echo $text|mail -s test 13146156766@126.com
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命令的熟悉,该怎么做你懂的,加油!
在此欢迎您发表您的看法,咱们一起学习。