6.9 KiB
6.9 KiB
Shell 函数
一:函数
1. 介绍
Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。
2. 定义函数
可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
function name() {
# 函数体
commands
}
-
function 是 Shell 中的关键字,专门用来定义函数;
-
name 是函数名;
-
commands 是函数要执行的代码,也就是一组语句;
-
return value 表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写。
-
由 { } 包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。
-
函数的优势
- 方便n次使用,减少代码量,使之方便,整洁。
- 当需要修改里面的重复代码时,只需要修改一次函数即可实现需求;
- 将函数写进文件,需要时直接通过文件调用
3. 调用函数
执行不带参数的函数
直接输入函数名即可,不需要带括号
functionName
- 执行函数时,函数名前的关键字
function
和函数名后面的()
均不需要带 - 函数的定义必须要在执行的程序前定义或加载
执行带参数的函数
greet() {
echo "Hello, $1! You have $# arguments."
}
greet "Alice" 42 # 输出:Hello, Alice! You have 2 arguments.
- 向函数传递参数时,参数通过位置变量
$1
,$2
,$3
... 接收。 $@
表示所有参数,$#
表示参数个数。
调用函数示例
[root@wxin ~]# vim testfunction.sh
#!/bin/bash
# first function
function HelloWorld() {
echo "Hello world"
}
# second function
Welcome() {
echo "Welcome to qfedu"
}
# third function
function HelloShell {
echo "Hello Shell"
}
# file functions
HelloWorld # 调用函数
Welcome
HelloShell
[root@wxin ~]# bash testfunction.sh
Hello world
Welcome to qfedu
Hello Shell
从文件中调用函数示例
[root@wxin ~]# vim filefunction.sh
function Sum () {
for((i=1;i<=100;i++))
do
((sum=sum+i))
done
echo '{1..100} sum is :' $sum
}
[root@wxin ~]# vim filefunctionfromfile.sh
#!/bin/bash
path="/root/Test/filefunction.sh"
if [ -f ${path} ]
then
source $path # 加载函数
Sum # 调用函数
else
echo "file not exist or error"
fi
[root@wxin ~]# bash filefunctionfromfile.sh
{1..100} sum is : 5050
函数参数传递示例
[root@wxin ~]# vim functionwithargs.sh
#!/bin/bash
function Add () { # 定义函数
((sum=$1+$2))
echo "$1 + $2 sum is" ${sum}
}
Add $1 $2 # 调用函数并传递参数
[root@wxin ~]# bash functionwithargs.sh 100 150
100 + 150 sum is 250
[root@wxin ~]# bash functionwithargs.sh 509 150
509 + 150 sum is 659
4. 返回值
- Shell 函数通过
return
返回整数状态码(0 表示成功,非 0 表示失败)。 - 若要返回字符串或复杂数据,可使用
echo
输出到标准输出,再通过命令替换捕获。
add() {
local sum=$(( $1 + $2 ))
echo $sum # 输出结果到标准输出
}
result=$(add 3 5) # 捕获返回值
echo "Sum is $result" # 输出:Sum is 8
5. 变量作用域
- 默认情况下,函数内变量是全局的(会影响到脚本其他部分)。
- 使用
local
关键字定义局部变量(仅在函数内有效)。
test_scope() {
local var_local="I'm local"
var_global="I'm global"
}
test_scope
echo $var_global # 输出:I'm global
echo $var_local # 输出为空(局部变量不可见)
6. 函数案例
#!/bin/bash
list()
{
echo "+++++++++++++++++++++++++++++++++"
echo "+++++++ 百宝箱 ++++++++"
echo "+++++++++++++++++++++++++++++++++"
echo "|||||||||||||||||||||||||||||||||"
echo "================================="
echo "= 1.yum仓库初始化 ="
echo "= 2.上课笔记工具安装 ="
echo "= 3.kvm虚拟机安装 ="
echo "= 4.vmware虚拟机安装 ="
echo "= 5.vs code安装 ="
echo "= 6.google浏览器安装 ="
echo "= 7.vnc-server的安装 ="
echo "= 8.一键安装所有 ="
echo "= 9.退出 ="
echo "================================="
}
yum-install(){
echo "====正在执行yum初始化操作请耐心等待!===="
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo > /dev/null
yum -y install wget > /dev/null
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
echo "====正在清空缓存,请耐心等待!===="
yum clean all
echo "====正在重新加载,请耐心等待!===="
yum makecache
echo "====successed===="
}
cherrytree(){
echo "====正在进行安装......====="
yum -y install cherrytree > /dev/null
if [ $? -eq 0 ];then
echo "====successed===="
else
echo "==== failed ===="
echo "====检查网络和yum仓库===="
exit
fi
}
kvm-install(){
echo "====正在安装kvm虚拟机===="
yum -y install libvirt* virt-manager >> /dev/null && yum -y groupinstall 'Virtualization Host' >> /dev/null
echo "==== successed ===="
}
vmware-install(){
echo "====请将vmware安装包放到当前目录下===="
chmod +x
echo "......."
echo "..........."
echo ".................100%"
}
data=`date | awk '{print $4}'`
read -p "当前时间为${data},你是否要进行电脑初始化,继续请按回车(已记录你的初始时间):"
ping -c1 www.baidu.com 1> /dev/null
if [ $? -eq 0 ];then
echo "网络状况良好,请继续~"
else
echo "网络状况不佳,检查网络~"
exit
fi
echo "xingdian" > user.txt
echo "dianye" > password.txt
read -p "欢迎使用行癫工具箱,进行安装部署操作:"
read -p "请输入用户名:" name
username=`cat user.txt | awk '{print $1}'`
passwd=`cat password.txt | awk '{print $1}'`
if [ "${name}" == "${username}" ];then
read -p "请输入密码:" password
if [ "${password}" == "${passwd}" ];then
echo "登陆成功,进入工具箱"
while :
do
list
read -p "请选择你要使用的工具代码:" num
case $num in
1)
yum-install
sleep 3
;;
2)
cherrytree
sleep 3
;;
3)
;;
4)
;;
9)
break
;;
esac
done
data2=`date | awk '{print $4}'`
echo "结束时间为${data2};感谢您的使用!"
else
echo "用户名密码错误,请重新执行脚本!"
exit
fi
else
echo "用户名输入错误,请重新输入!"
exit
fis