【linux/shell】shell中实现函数重载

在 shell 脚本中,函数重载(Function Overloading)的概念与一些编程语言(如 Java 或 C#)中的函数重载不同。在这些编程语言中,你可以定义多个同名函数,只要它们的参数列表不同。然而,在 shell 脚本中,你不能基于参数数量或类型来重载函数。每次定义一个同名函数时,新的函数定义都会覆盖旧的定义。
但是,你可以使用一些技巧来模拟函数重载的行为:
1. 参数个数检查
基于传递给函数的参数个数来执行不同的逻辑:

myfunc() {if [ "$#" -eq 1 ]; thenecho "One argument provided: $1"elif [ "$#" -eq 2 ]; thenecho "Two arguments provided: $1 and $2"elseecho "No arguments provided"fi
}myfunc arg1        # 输出: One argument provided: arg1
myfunc arg1 arg2   # 输出: Two arguments provided: arg1 and arg2
myfunc             # 输出: No arguments provided

2. 参数类型检查
基于参数的类型或内容来执行不同的逻辑:

myfunc() {case "$1" in--number)echo "You entered a number: $2";;--text)echo "You entered text: $2";;*)echo "Unknown option: $1";;esac
}myfunc --number 42 # 输出: You entered a number: 42
myfunc --text hello # 输出: You entered text: hello
myfunc --unknown # 输出: Unknown option: --unknown


3. 使用  getopts  进行选项解析
对于命令行参数,可以使用  getopts  来解析并根据选项执行不同的逻辑:

myfunc() {local OPTIND optwhile getopts "n:t:" opt; docase $opt inn)echo "Number option provided: $OPTARG";;t)echo "Text option provided: $OPTARG";;*)echo "Invalid option: -$OPTARG";;esacdone
}myfunc -n 123 # 输出: Number option provided: 123
myfunc -t "hello" # 输出: Text option provided: hello


4. 使用函数参数作为开关
使用函数的第一个参数作为开关来决定执行的逻辑:

myfunc() {if [ "$1" == "--list" ]; thenecho "Listing items..."# 执行列表逻辑elif [ "$1" == "--count" ]; thenecho "Counting items..."# 执行计数逻辑elseecho "Default action..."# 默认逻辑fi
}myfunc --list # 输出: Listing items...
myfunc --count # 输出: Counting items...
myfunc # 输出: Default action...


5. 动态函数名称
基于参数动态创建函数名称(虽然这不是真正的重载,但可以作为一种替代方案):

myfunc() {local func_name="myfunc_$1"declare -f "$func_name" > /dev/null 2>&1if [ $? -eq 0 ]; then"$func_name" "$2"elseecho "Function $func_name does not exist."fi
}# 定义具体的函数
myfunc_list() {echo "Listing items..."
}myfunc_count() {echo "Counting items..."
}# 使用动态函数名称调用
myfunc list # 输出: Listing items...
myfunc count # 输出: Counting items...
myfunc other # 输出: Function myfunc_other does not exist.


在 shell 脚本中,虽然不能直接实现函数重载,但通过上述方法可以根据参数的不同来模拟类似的行为。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/41763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言基础全解:细说每个知识点

目录 1. 进制转换方法 1.1 二进制转十进制 1.2 十进制转二进制 1.3 二进制转八进制 1.4 二进制转十六进制 1.5 八进制转二进制 1.6 十六进制转二进制 2. 进制简介 特别注意 C语言基础元素概览 1. 关键字分类 1.1 存储类型关键字 1.2 数据类型关键字 1.3 构造类型…

25.【C语言】循环结构之for 上

1.基本使用 类比while 在while循环中&#xff0c;有三个不可或缺的部分&#xff1a;初始化&#xff0c;判断部分&#xff0c;调整部分 int i 0;//初始化 while (i < 10)//判断部分 {……i;//调整部分 }三个部分太分散&#xff0c;用for循环可集为一体&#xff0c;简洁 …

使用shell脚本实现DM8开机自动启动

编写shell脚本 #!/bin/bashsu -dmdba >>EOF cd /home/dmdba/dmdbms/bin ./DmServiceDMTEST start echo "dm start ... " EOF注意&#xff1a;DmServiceDMTEST每个服务器设置的不一样&#xff0c;根据实际进行更换 授权脚本可执行权限 chmod -x /dmdata/dmse…

Kotlin中的关键字

Kotlin 中的关键字可分为几个大类&#xff1a; 声明/定义关键字&#xff1a; class&#xff1a;用于定义类interface&#xff1a;用于定义接口object&#xff1a;用于声明对象&#xff0c;Kotlin中实现单例模式的关键字fun&#xff1a;用于声明函数var&#xff1a;用于声明可变…

目标检测精度提升秘籍:算法优化策略全解析

标题&#xff1a;目标检测精度提升秘籍&#xff1a;算法优化策略全解析 目标检测是计算机视觉领域的核心技术之一&#xff0c;广泛应用于视频监控、自动驾驶、医疗成像等领域。然而&#xff0c;提升目标检测算法的准确性是一个持续的挑战。本文将深入探讨如何优化目标检测算法…

web学习笔记(七十九)

目录 1.全局共享数据的用法 2.小程序的本地持久化存储 3.小程序获取头像和用户昵称 4.如何实现进入页面就隐藏TabBar 1.全局共享数据的用法 小程序中的全局数据再app.js文件中声明&#xff0c;app本来就是小程序给我们配置的全局文件&#xff0c;因此在app.js文件中声明的…

数据结构第12节 有向图

有向图&#xff08;Directed Graph 或 Digraph&#xff09;是一种图数据结构&#xff0c;其中的边具有方向性。这意味着在一个有向图中&#xff0c;边可以被视为箭头&#xff0c;箭头从一个顶点指向另一个顶点&#xff0c;表示从起点到终点的单向关系。有向图的这种特性使得它在…

搭建互联网医院实战:从源码到在线问诊APP的全流程开发

今天&#xff0c;笔者将讲述在线问诊APP的全流程开发&#xff0c;帮助开发者理解和掌握搭建互联网医院的核心技术和步骤。 一、需求分析与设计 需求分析包括明确目标用户、功能需求、性能需求等。设计阶段则包括系统架构设计、数据库设计和前后端界面设计等。 1.目标用户&…

最小权顶点覆盖问题-优先队列分支限界法-C++

问题描述: 给定一个赋权无向图 G(V,E)&#xff0c;每个顶点 v∈V 都有一个权值 w(v)。如果 U⊆V&#xff0c;U⊆V&#xff0c;且对任意(u,v)∈E 有 u∈U 或 v∈U&#xff0c;就称 U 为图 G 的一个顶点覆盖。G 的最小权顶点覆盖是指 G 中所含顶点权之和最小的顶点覆盖。对于给定…

提取重复数据

直接上控制台代码&#xff1a; Module Module1Sub Main()Console.WriteLine("请输入数据&#xff0c;以""&#xff0c;""相隔&#xff1a;")Dim str As String Console.ReadLineDim result From x In str.Split(",")Group By x Int…

NTP协议格式解析

1. NTP时间戳格式 SNTP使用在RFC 1305 及其以前的版本所描述标准NTP时间戳的格式。与因特网标准标准一致&#xff0c; NTP 数据被指定为整数或定点小数&#xff0c;位以big-endian风格从左边0位或者高位计数。除非不这样指定&#xff0c;全部数量都将设成unsigned的类型&#…

用python做DDL的静态分析

最近在用python做DDL SQL的分析&#xff0c;用的是simple_ddl_parser1.5.1。遇到了一些问题&#xff0c;记录一下。 simple_ddl_parser能解析多种数据库的DDL语句&#xff0c;我要处理的是mysql的DDL&#xff0c;发现有些mysql的写法还是不支持&#xff1a; 在表层面不支持使用…

Android Graphics 显示系统 - 监测、计算FPS的工具及设计分析

“ 在Android图像显示相关的开发、调试、测试过程中&#xff0c;如何能有效地评估画面的流畅度及监测、计算图层渲染显示的实时FPS呢&#xff1f;本篇文章将会提供一种实用、灵巧的思路。” 01 设计初衷 面对开发测试中遇到的卡顿掉帧问题&#xff0c;如何在复现卡顿的过程中持…

大模型AIGC转行记录(一)

自从22年11月chat gpt上线以来&#xff0c;这一轮的技术浪潮便变得不可收拾。我记得那年9月份先是在技术圈内讨论&#xff0c;然后迅速地&#xff0c;全社会在讨论&#xff0c;各个科技巨头、金融机构、政府部门快速跟进。 软件开发行业过去与现状 我19年决定转码的时候&…

代码随想录算法训练营第四十五天| 300.最长递增子序列、 674. 最长连续递增序列、 718. 最长重复子数组

300.最长递增子序列 题目链接&#xff1a;300.最长递增子序列 文档讲解&#xff1a;代码随想录 状态&#xff1a;不会&#xff0c;递推状态的时候只想着如何从dp[i-1]推导dp[i]&#xff0c;没想过可能需要枚举dp[0-i] 思路&#xff1a; 找出所有比自己小的数字的dp[j],在这些dp…

【K8s】【问题排查】k8s只能本地服务器访问服务,其他节点无法访问服务

出现原因&#xff1a; 问题描述&#xff1a;k8s部署服务之后&#xff0c;只能在Pod所在的节点通过node ip 对外暴露的端口请求&#xff1b;无法使用CLUSTER-IP端口访问。也不能在其他Node节点通过Pod所在的节点通过node ip 对外暴露的端口请求&#xff1b; 主机名与IP对应情况&…

随着人工智能与机器学习的广泛应用,Java 如何有效地与深度学习框架进行集成,以实现更智能的应用开发?

Java作为一种广泛使用的编程语言&#xff0c;在人工智能和机器学习领域也有着一定的应用。Java可以通过与深度学习框架的集成来实现更智能的应用开发&#xff0c;以下是一些方法&#xff1a; 使用Java的深度学习框架&#xff1a;Java有一些针对深度学习的框架&#xff0c;如DL4…

SpringBoot 实现视频分段播放(通过进度条来加载视频)

需求&#xff1a;现在我本地电脑中有一个文件夹&#xff0c;文件夹中都是视频&#xff0c;需要实现视频播放的功能。 问题&#xff1a;如果通过类似 SpringBoot static 文件夹的方式来实现&#xff0c;客户端要下载好完整的视频之后才可以播放&#xff0c;并且服务端也会占用大…

秋招突击——7/5——设计模式知识点补充——适配器模式、代理模式和装饰器模式

文章目录 引言正文适配器模式学习篮球翻译适配器 面试题 代理模式学习面试题 装饰器模式学习装饰模式总结 面试题 总结 引言 为了一雪前耻&#xff0c;之前腾讯面试的极其差&#xff0c;设计模式一点都不会&#xff0c;这里找了一点设计模式的面试题&#xff0c;就针对几个常考…

计算机图形学入门24:材质与外观

1.前言 想要得到一个漂亮准确的场景渲染效果&#xff0c;不只需要物理正确的全局照明算法&#xff0c;也要了解现实中各种物体的表面外观和在图形学中的模拟方式。而物体的外观和材质其实就是同一个意思&#xff0c;不同的材质在光照下就会表现出不同的外观&#xff0c;所以外观…