【Shell语言学堂】函数调用练习

本文介绍了Shell编程中的函数概念,如何定义和调用函数,以及实战案例,如绘制菱形、正三角倒三角、IP地址的十进制和二进制转换。
摘要由CSDN通过智能技术生成

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%.*}

在这里插入图片描述


在这里插入图片描述

  • 41
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值