目录
一、shell函数
1.函数的作用
2.函数的优点
二、shell函数的格式
2.1函数返回值return
2.2函数变量
三、函数传参
四、递归函数
4.1查找输入目录下文件及其子目录下文件
4.2将IP地址转换为二进制
五、函数数据库
一、shell函数
1.函数的作用
把程序里需要多次使用的部分代码列出来,然后为这部分代码起个名字,其它所有的重复调用这部分代码都只用调用这个名字就可以(类似于别名)。当需要修改这部分重复代码时,只需要改变函数体内的一份代码即可实现调用修改。
2.函数的优点
- 把相同的程序定义为函数,避免代码重复,减少整个程序的代码量
- 增强代码的可读性,便于管理
- 修改代码时只需在函数内修改,不需要在整个程序中更改
二、shell函数的格式
(1)function 函数名 {
命令序列
}
(2)函数名() {
命令序列
}
2.1函数返回值return
return表示退出函数并返回一个退出值,脚本中用 echo $? 显示返回值。
使用原则:
- 函数一结束就取返回值,因为 $? 变量只返回执行的最后一条命令的退出状态码,退出状态码范围必须 0-255 ,超出范围时返回值除以256取余
- 在函数内用 echo 输出值,在函数体外可用 变量=$(函数名) 获取函数的返回值
示例:
#!/bin/bash
##定义函数
aa() {
read -p "输入一个整数:" num
return $[num * 2]
}
######main######
##调用函数,主程序代码
aa
echo $?
2.2函数变量
函数变量的作用范围:
- 函数仅在shell脚本中shell环境中有效;使用 source 执行脚本,变量也会影响系统当前的shell环境。
- 脚本中变量默认全局有效(即函数体内外有效)
- 在函数体内执行 local 变量,可将变量限定在函数体内使用。
#!/bin/bash
db() {
local name=lisi #local 变量 将变量限制在函数内
echo $name
}
###main###
name=zhangsan
db
echo $name
三、函数传参
函数体内部:
- $1,$2表示调用函数时,函数后跟的位置参数
- $# 表示调用函数时,函数后跟的参数个数
- $@,$* 表示调用函数时,函数后跟的所有参数
函数体外部:
- $1,$2表示执行脚本时,脚本后跟的位置参数
- $# 表示执行脚本时,脚本后跟的参数个数
- $@,$* 表示执行脚本时,脚本后跟的所有参数
无论在函数体内外,$0 表示脚本本身
示例:
#!/bin/bash
sum () {
sum=$[$1 - $2]
echo "函数内\$1值为$1"
echo "函数内\$2值为$2"
echo $sum
}
####main####
sum $2 $1
#函数后位置参数$2为执行脚本后第一个位置参数,$1为执行脚本后第二个位置参数
echo "函数外\$1值为$1"
echo "函数外\$2值为$2"
四、递归函数
函数调用自己本身的函数
4.1查找输入目录下文件及其子目录下文件
#!/bin/bash
#递归查询目录下所有文件和目录并显示结果
qq () {
for i in `ls $1`
do
if [ -d $1/$i ]
then
echo "$2目录$i"
qq "$1/$i" " $2"
#查询的是目录,就调用函数对目录下内容继续查看。
#首次查询$2为空(不缩进),如果是目录,再次调用函数查询,在原基础上缩进2个空格。
else
echo "$2文件$i"
fi
done
}
###main###
read -p "输入所查询目录的绝对路径:" num
qq "$num" ""
4.2将IP地址转换为二进制
#!/bin/bash
#定义一个将十进制数转换为二进制的函数
switch() {
num=$1
for i in {1..8}
do
a=$[num % 2]$a
let num/=2
done
echo $a
}
#定义将分割IP地址的函数
spt() {
ip=$1
for i in {1..4}
do
NUM=${ip%%.*}
ip=${ip#*.}
result=$(switch NUM)
echo -n $result.
#结果不换行输出,并在每个结果后加“.”
done
}
###main###
read -p "输入一个合法ip:" ipaddr
res=$(spt $ipaddr)
echo ${res%.*}
#输出结果删除最后一个“.”
五、函数数据库
#将函数写入函数库中
jiafa() {
echo $[$1 + $2]
}
jianfa() {
echo $[$1 -$2]
}
chengfa() {
echo $[$1 * $2]
}
chufa() {
if [ $2 -eq 0 ];then
echo "除数不可为0"
else
echo $[$1 / $2]
fi
}
#!/bin/bash
#加载数据库文件到当前脚本的shell
source /opt/hanshuku.sh
read -p "输入一个整数:" num1
read -p "输入一个整数:" num2
res1=$(jiafa $num1 $num2)
res2=$(jianfa $num1 $num2)
res3=$(chengfa $num1 $num2)
res4=$(chufa $num1 $num2)
echo "$num1+$num2=$res1"
echo "$num1-$num2=$res2"
echo "$num1*$num2=$res3"
echo "$num1/$num2=$res4"