Shell编程的函数
Shell中的函数
概念
函数就是将你需要执行的shell命令组合起来,组成一个函数体。一个完整的函数包括函数头和函数体,其中函数名就是函数的名字。
优点
将相同的程序,定义,封装为一个函数,能减少程序的代码数量,提高开发效率。
使用函数,能让你写更少的代码,早点写完,早点回家休息多好。
函数能够增加代码的可读性,易读性,容器管理。
函数的实际开发
shell函数定义的语法
标准shell函数定义
function 函数名() {
函数体
你想执行的Linux命令
return 返回值
}
执行函数的基础概念
有关函数执行的基本概念
- 执行shell函数,直接写函数名字即可,无需添加其他内容
- 函数必须先定义,在执行,shell脚本自上而下加载
- 函数体内定义的变量,称之为局部变量
- 函数体内需要添加return语句,作用是退出函数,且赋予返回值给调用该函数的程序,也就是shell脚本
- return语句和exit不同
- return是结束函数的执行,返回一个(退出值、返回值)
- exit是结束shell环境,返回一个(退出值、返回值)给当前的shell
- 函数如果单独写入一个文件里,需要用source读取
- 函数内,使用local关键字,定义局部变量
函数调用
定义函数的代码段不会自动执行,而是在调用时执行;在函数定义好后,用户可以在shell 中直接调用,调用时不用带上();调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可。
示例一:
#!/bin/bash
# 函数定义
function show(){
echo "Hello word"
}
## 函数调用
show
输出结果:
Hello word
实战案例
1、实现画菱形
#!/bin/bash
# 根据提供的高度,打印一个由星号组成的等腰三角形,然后打印一个倒置的等腰三角形。
height=$1 # 接收命令行传入的高度参数
# 打印正向等腰三角形
for ((i=1;i<=height;i++))
do
# 打印每行前面的空格
for((j=1;j<=$height-$i;j++))
do
echo -n " "
done
# 打印每行的星号
for((k=1;k<=2*$i-1;k++))
do
echo -n "*"
done
echo '' # 换行
done
# 打印倒置的等腰三角形
for ((i=$height-1;i>=0;i--))
do
# 打印每行前面的空格
for((j=1;j<=$height-$i;j++))
do
echo -n " "
done
# 打印每行的星号
for((k=1;k<=2*$i-1;k++))
do
echo -n "*"
done
echo '' # 换行
done
2、将画正三角和倒三角拆分为两个函数
#!/bin/bash
# 根据提供的高度,打印一个由星号组成的等腰三角形,然后打印一个倒置的等腰三角形。
height=$1 # 接收命令行传入的高度参数
# 打印正向等腰三角形
function due_3 {
for ((i=1;i<=height;i++))
do
# 打印每行前面的空格
for((j=1;j<=$height-$i;j++))
do
echo -n " "
done
# 打印每行的星号
for((k=1;k<=2*$i-1;k++))
do
echo -n "*"
done
echo '' # 换行
done
}
# 打印倒置的等腰三角形
function reve_3 {
for ((i=$height-1;i>=0;i--))
do
# 打印每行前面的空格
for((j=1;j<=$height-$i;j++))
do
echo -n " "
done
# 打印每行的星号
for((k=1;k<=2*$i-1;k++))
do
echo -n "*"
done
echo '' # 换行
done
}
due_3 $1
reve_3 $1
3、将菱形的代码拆解成1个函数:画空格和*号
#!/bin/bash
# 脚本用于绘制一个菱形,菱形的大小由命令行参数决定
# 参数说明:
# $1 菱形一半的高度(必须为正整数)
height=$1
function space {
# 在行首输出指定数量的空格
# $1 需要输出的空格数量
# $2 需要输出的星号数量
for((k=1;k<=$1;k++))
do
echo -n " "
done
for((x=1;x<=$2;x++))
do
echo -n "*"
done
}
function diamond {
# 绘制菱形上半部分
for((i=1;i<=$height;i++))
do
sp=$((height-i)) # 计算当前行需要输出的空格数量
st=$((2*i-1)) # 计算当前行需要输出的星号数量
space $sp $st
echo ''
done
# 绘制菱形下半部分
for((j=$((height-1));j>=1;j--))
do
sp=$((height-j)) # 计算当前行需要输出的空格数量
st=$((2*j-1)) # 计算当前行需要输出的星号数量
space $sp $st
echo ''
done
}
diamond $1 # 调用函数,绘制菱形
4、将十进制的IP地址转为二进制
#!/bin/bash
# bin函数:将十进制数字转换为8位二进制字符串
# 参数:num 十进制数字
# 返回值:无,直接输出二进制字符串
function bin {
local sum=''
local num=$1
for ((i=1;i<=8;i++)); do
sum="$((num % 2))$sum"
num=$((num / 2))
done
echo $sum
}
# SPT函数:将十进制格式的IP地址转换为二进制格式
# 参数:ip 十进制格式的IP地址
# 返回值:无,直接输出二进制格式的IP地址
function SPT {
local ip=$1
local octet
# 遍历IP地址的每个八位字节,将其转换为二进制并输出
for ((i=1;i<=4;i++)); do
octet=$(echo $ip | awk -F. '{print $'$i'}')
BIN=$(bin $octet)
echo -n $BIN.
done
echo
}
# 读取用户输入的十进制IP地址
read -p "请输入一个十进制的IP地址:" SIP
# 调用SPT函数处理用户输入的IP地址,并存储结果
RES=$(SPT $SIP)
# 输出处理后的二进制IP地址
echo "输出的二进制IP为:" ${RES%.*}
5、选做:将二进制的IP地址转为十进制
#!/bin/bash
# 函数:dec
# 将一个八位二进制数转换为十进制。
# 参数:
# $1: 八位二进制数字符串。
# 返回值:
# 转换后的十进制数。
function dec {
local sum=0
local num=$1
# 遍历二进制数的每一位,将其转换为十进制。
for ((i=1;i<=8;i++)); do
# 提取当前位的二进制数。
oct=$(echo $num | awk '{print substr($0, '$i', 1)}')
# 计算当前位对应的十进制值,并累加到总和。
sum=$(echo "$sum + $oct * 2^(8-$i)" | bc)
done
echo $sum
}
# 函数:SPT
# 将一个四组八位二进制数的IP地址转换为十进制形式。
# 参数:
# $1: 四组八位二进制数组成的IP地址字符串。
# 返回值:
# 直接输出转换后的十进制IP地址。
function SPT {
local ip=$1
local octet
# 遍历IP地址中的每一组八位二进制数,将其转换为十进制。
for ((i=1;i<=4;i++)); do
octet=$(echo $ip | awk -F. '{print $'$i'}')
DEC=$(dec $octet)
# 输出转换后的十进制IP地址。
echo -n $DEC.
done
echo
}
# 读取用户输入的二进制IP地址。
read -p "请输入一个二进制的IP地址:" SIP
# 调用SPT函数处理用户输入,并存储结果。
RES=$(SPT $SIP)
# 输出最终的十进制IP地址。
echo "输出的十进制IP为:" ${RES%.*}