shell函数:
使用函数可以避免代码重复
使用函数可以将大的工程分隔为若干的功能模块,代码的可读性更强
shell函数定义:
封装的可重复利用的具有特定功能的代码
方法一:
[function] 函数名 { ##三部分之间都要有空格
命令序列
}
方法二:
函数名(){
命令序列
}
函数返回值
使用return
return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
1.函数一结束就返回值,因为 $? 变量只返回执行的最后一条命令的退出状态码
2.退出状态码必须是0-255,超出时将为除以256取余
格式
#!/bin/bash
function test1 {
read -p "请输入一个值:" va
return $[$va * 2]
}
test1 #调用函数
echo $?
使用echo
因为return的返回值的范围是0-255,超过部分除以256取余,得不到我们想要的结果,此时可以直接在函数体中使用echo命令。
格式:
#!/bin/bash
function test1 {
read -p "请输入一个值:" va
#return $[$va * 2]
echo $[$va * 2]
}
#test1 #调用函数
result=$(test1)
echo $result
函数传参
实际操作
操作一:
#!/bin/bash
sum() {
sum1=$[$1 + $2]
echo $sum1
}
read -p "请输入第一个参数: " first
read -p "请输入第二个参数: " second
sum $first $second
操作二:
#!/bin/bash
test() {
#在函数体内部的$1、$2.....代表的是调用函数是函数后面跟的位置参数
#test 30 50
sum=$[$1 - $2]
echo $sum
}
##函数体外面的$1、$2.....代表的是执行脚本时脚本后面跟的位置参数
##./demo2.sh 50 30
test $2 $1
示例:
#!/bin/bash
#定义一个用于十进制转换二进制的函数
bin() {
SUM=''
NUM=$1
for i in {1..8}
do
SUM=$[NUM % 2]$SUM
let NUM/=2
done
echo $SUM
}
#定义用于分割IP的函数
SPT() {
IP=$1
for i in {1..4}
do
num=${IP%%.*}
IP=${IP#*.}
#使用bin函数转换
BIN=$(bin $num)
echo -n $BIN.
done
}
read -p "请输入你要的转换的IP地址:" SIP
RES=$(SPT $SIP)
##删除末尾的.
echo ${RES%.*}
函数变量的作用范围:
函数在shell脚本中仅在当前shell环境中有效
shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
函数递归
函数调用自己本身的函数
函数的递归应用:阶乘
#!/bin/bash
#递归求阶乘
fact() {
num=$1
if [ $num -eq 1 ];then
echo 1
else
#定义一个本地变量temp,变量值为每次传入的参数值减1
temp=$[num - 1]
#不停地调用函数自身,直到temp的值等于1
local result=$(fact $temp)
echo $[num * result]
fi
}
read -p "请输入一个正整数:" n
result=$(fact $n)
echo "$n阶乘的值为$result"
分析:
n=5 fact=5
$1=5 temp=$1-1=4 result=$(fact 4)
$1=4 temp=$1-1=3 result=$(fact 3)
$1=3 temp=$1-1=2 result=$(fact 2)
$1=2 temp=$1-1=1 result=$(fact 1)
$1=1
函数的递归应用:递归目录
使用循环方式把/var/log目录下的文件和目录分出来并输出
#!/bin/bash
#递归目录
myfunc() {
for f in `ls $1`
do
if [ -d /$1/$f ];then
echo "$2$1/$f 为目录"
myfunc "$2$1/$f" " $2"
else
echo "$2$1/$f 为文件"
fi
done
}
myfunc "/var/log" ""
函数库
我们可以事先创建一个函数库文件,在里面定义各种常用的函数,然后可以在别的shell脚本中直接引用这个函数库文件,使得不需要再次定义函数即可直接调用函数。
注意:
- "source"和 "." 是在当前shell环境中运行脚本
- 如果函数库文件中定义了变量的话,切换bash环境就不生效了。所以在脚本中引用函数库文件时,一定要使用"source"或 "."
- 引用函数库文件时,建议使用绝对路径,避免找不到该文件
创建库
创建一个文件 myfunc
jiafa() {
echo $[$1 + $2]
}
jianfa() {
echo $[$1 - $2]
}
chengfa() {
echo $[$1 * $2]
}
chufa() {
if [ $2 -ne 0 ];then
echo $[$1 / $2]
else
echo "除数不能为0"
fi
}
fact() {
num=$1
if [ $num -eq 1 ];then
echo 1
else
temp=$[num - 1]
local result=$(fact $temp)
echo $[num * result]
fi
}
建立一个脚本文件
#!/bin/bash
source/. 函数库文件
v1=$1
v2=$2
res1=$(jiafa $v1 $v2)
res2=$(jianfa $v1 $v2)
res3=$(chengfa $v1 $v2)
res4=$(chufa $v1 $v2)
res5=$(fact $v1)
echo "加法的结果为:$res1"
echo "减法的结果为:$res2"
echo "乘法的结果为:$res3"
echo "除法的结果为:$res4"
echo "阶乘的结果为:$res5"