函数概述
将命令序列按格式写在一起,可方便重复使用命令序列
shell函数格式
【1】
function 函数名 {
命令序列
}
【2】
函数名(){
命令序列
}
函数返回值
1 函数内用 return 退出函数并返回函数值;函数外用 echo $?获取返回值
(退出状态码必须是0~255,超出值将除以256取余)
2 在函数内用echo输出值,在函数体外可用变量=$(函数名)获取函数返回值
函数传参
函数名 参数1 参数2 ....
函数变量的作用范围
函数默认只能脚本内的shell环境有效(使用source执行脚本,也会影响当前shell环境)
脚本中的变量默认全局有效(即函数体内外都有效)
在函数体内执行local 变量,可将变量限定在函数体内部使用
#!/bin/bash
a () {
i=8 #定义函数内i=8
echo $i 输出$i
}
i=9 #函数体外赋值i=9
echo $i 输出 $i
a 执行函数
不同变化
递归阶乘
函数调用自己本身的函数
#!/bin/bash
cx () {
for f in $(ls $1)
do
if [ -d "$1/$f" ]
then
echo "$2目录$f"
cx "$1/$f" " $2"
#查询的是目录,就调用函数往下一层目录继续查看
else
echo "$2文件$f"
fi
done
}
cx "/var/log" ""
#设置参数 $1是/var/log $2是空
例题:先mkdir -p /root/bin/aa/bb/cc/dd ; touch /root/bin/aa/bb/cc/dd/abc.txt,再输出环境变量PATH所包含的所有目录以及其中的子目录和所有不可执行文件
#D定义一个遍历PATH的环境变量的函数
list_path () {
IFSB=$IFS
IFS=$IFS':'
for F in $PATH
do
echo $F
done
IFS=$IFSB
}
#定义一个递归函数
listf() {
for F in $(ls $1)
do
if [ -d "$1/$F" ];then
echo "$2$F"
else
if [ ! -x "$1/$F" ];then
echo "$2$F"
fi
fi
done
}
#######main####
folder=$(list_path)
for path in $folder
do
listf "$path" ""
将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
}