一、函数
概述
函数是一段完成特定功能的代码片段。在Shell中定义的函数就可以使用代码模块化用于复用代码。注意,函数必须先定义才可以使用哦。
本章重点:
传参 $1 $2
局部变量 local
返回值 return 即 $?
一、定义函数
方法一:
函数名(){
函数要实现的功能代码
}
方法二:
function 函数名{
函数要实现的功能代码
}
二、调用函数
函数名
函数名 参数1 参数2
方法一:
[root@localhost] vim function.sh
cat << EOF
1............
2............
3............
4............
5............
EOF
}
caidan
[root@localhost] bash function.sh
1............
2............
3............
4............
5............
方法二
[root@localhost] vim function.sh
function caidan {
cat << EOF
1............
2............
3............
4............
5............
EOF
}
caidan
[root@localhost] bash function.sh
1............
2............
3............
4............
5............
三、示例
示例1、初识函数
需求:通过shell脚本编写系统工具箱,编写循环脚本,功能菜单
没使用函数的效果(代码冗余,复用率低,高冗余)
#!/bin/bash
#作者:何永斌
#2022 12/26
while :
do
cat <<EOF #EOF否面绝对不要多打空格,否则会报错
---------系统工具箱-----------
| 1.查看磁盘信息 |
| 2.查看cpu信息 |
| 3.查看内存信息 |
| 4.查看网络信息 |
| 5.查看进程信息 |
| 6.退出工具箱 |
---------系统工具箱-----------
EOF #EOF否面绝对不要多打空格,否则会报错
read -p "请您输入您的选择[1..6]:" num
case $num in
1)
df -hT
read -p "继续查询按Y,退出查询按N:" yu
if [ "$yu" = Y ]
then
clear
else
exit 66
fi
;;
2)
uptime
read -p "继续查询按Y,退出查询按N:" yu
if [ "$yu" = Y ]
then
clear
else
exit 66
fi
;;
3)
free -m
read -p "继续查询按Y,退出查询按N:" yu
if [ "$yu" = Y ]
then
clear
else
exit 66
fi
;;
4)
read -p "请输入您需要查询的网络接口号:" hao
netstat -anpt | head -2
netstat -anpt | grep $hao
read -p "继续查询按Y,退出查询按N:" yu
if [ "$yu" = Y ]
then
clear
else
exit 66
fi
;;
5)
read -p "请输入您要查询的进程名:" pss
ps aux | grep $pss
read -p "继续查询按Y,退出查询按N:" yu
if [ "$yu" = Y ]
then
clear
else
exit 66
fi
;;
6)
exit 88
;;
*)
echo "请您输入有效的序号。"
;;
esac
done
使用函数之后的代码(代码数量明显减少,复用率高)
#!/bin/bash
#作者:何永斌
#2022 12/26
caidan() {
cat <<EOF
---------系统工具箱-----------
| 1.查看磁盘信息 |
| 2.查看cpu信息 |
| 3.查看内存信息 |
| 4.查看网络信息 |
| 5.查看进程信息 |
| 6.退出工具箱 |
---------系统工具箱-----------
EOF
}
function queren () {
read -p "继续查询按Y,退出查询按N:" yu
if [ "$yu" = Y ]
then
clear
else
exit 66
fi
}
while :
do
caidan
read -p "请您输入您的选择[1..6]:" num
case $num in
1)
df -hT
uptime
queren
;;
3)
free -m
queren
;;
4)
read -p "请输入您需要查询的网络接口号:" hao
netstat -anpt | head -2
netstat -anpt | grep $hao
queren
;;
5)
read -p "请输入您要查询的进程名:" pss
ps aux | grep $pss
queren
;;
6)
exit 88
;;
*)
echo "请您输入有效的序号。"
;;
esac
done
函数传参
[root@localhost procedures] vim 1.sh
aaa () {
expr $1 \* 12
}
aaa $1
aaa $2
aaa $3
aaa $4
[root@localhost procedures] bash 1.sh 100
1200
2400
3600
4800
示例2、阶乘函数(传参)
c写法
[root@localhost procedures]# cat jiecheng.sh
#用c
fun1 () {
fff=1
for ((i=1;i<=$1;i++))
do
fff=$[$fff * $i]
done
echo "$1 的阶乘是 $fff"
}
fun1 $1
fun1 $2
fun1 $3
fun1 $4
[root@localhost procedures]# bash jiecheng.sh 1 2 3 4
1 的阶乘是 1
2 的阶乘是 2
3 的阶乘是 6
4 的阶乘是 24
shell写法
[root@localhost procedures]# cat jiecheng.sh
#!/bin/bash
fun1 () {
fff=1
for i in `seq $1`
do
let fff*=$i
done
echo "$1的阶乘是:$fff"
}
fun1 $1
fun1 $2
fun1 $3
fun1 $4
[root@localhost procedures]# bash jiecheng.sh 1 2 3 4
1 的阶乘是 1
2 的阶乘是 2
3 的阶乘是 6
4 的阶乘是 24
示例3、函数传参 数组传参
制作一个简单的阶乘脚本。通过数组给函数传参
[root@localhost procedures]# vim jiecheng.sh
#!/bin/bash
num=(1 2 3 4 5)
array () {
fac=1
for i in $* #所有参数
do
fac=$[$fac*$i]
done
echo $fac
}
array ${num[*]}
[root@localhost procedures]# bash jiecheng.sh
120
示例4、函数结果 赋予数组
原来的数组每个元素增加5,新的值在传给新的数组
[root@localhost procedures] vim jiecheng.sh
#!/bin/bash
num=(1 2 3 4 5)
array () {
local j #local定义变量仅在函数中有效
for i in $*
do
outarray[j++]=$[$i+5]
done
echo ${outarray[*]}
}
array ${num[*]}
[root@localhost procedures] bash jiecheng.sh
6 7 8 9 10
二、影响shell程序的内置命令
概览
: 永远为真
true 真
false 假
exit 退出程序
break 退出循环
continue 跳出本次循环
shift 使用位置参数向左移动,默认移动1,可以使用shift2。
需求
通过脚本,输出如下效果
A123456789
B123456789
...
D123456789
[root@localhost procedures] vim 1.sh
#!/bin/bash
for i in {A..D}
do
echo -n $i #不输出换行符
for j in {1..9}
do
echo -n $j
done
echo #再次输出一个回车
done
[root@localhost procedures] bash 1.sh
A123456789
B123456789
C123456789
D123456789
总结:循环如果出现了嵌套:外层循环一次,内部循环全部。
跳出5的循环(coutinue)
[root@localhost procedures] vim 1.sh
#!/bin/bash
for i in {A..D}
do
echo -n $i #不输出换行符
for j in {1..9}
do
if [ $j -eq 5 ]
then
continue
fi
echo -n $j
done
echo #再次输出一个回车
done
[root@localhost procedures] bash 1.sh
A12346789
B12346789
C12346789
D12346789
换成break
[root@localhost procedures] vim 1.sh
#!/bin/bash
for i in {A..D}
do
echo -n $i #不输出换行符
for j in {1..9}
do
if [ $j -eq 5 ]
then
# continue
break
fi
echo -n $j
done
echo #再次输出一个回车
done
[root@localhost procedures] bash 1.sh
A1234
B1234
C1234
D1234
break 后面跟数字决定跳出几个循环程序
[root@localhost procedures] vim 1.sh
#!/bin/bash
for i in {A..D}
do
echo -n $i #不输出换行符
for j in {1..9}
do
if [ $j -eq 5 ]
then
# continue
break 2 #退出两层循环体
fi
echo -n $j
done
echo #再次输出一个回车
done
[root@localhost procedures]# bash 1.sh
A1234
[root@localhost procedures]# vim 1.sh
#!/bin/bash
for i #如果后面不跟范围,参数会从外部提取
do
let sum+=$i
done
echo "总和为$sum"
[root@localhost procedures]# bash 1.sh 1 2 3 4
总和为10
shift:参数移动
[root@localhost procedures]# vim 1.sh
#!/bin/bash
while [ $# -ne 0 ] # $#参数的个数
do
let sum+=$1
shift #如果没有shift的话,程序将一直循环下去。
done
echo "总和为$sum"
[root@localhost procedures] bash 1.sh 1 2 3 4
总和为10