Bash函数详解

目录

    • **1. 基础函数**
    • **2. 参数处理函数**
    • **3. 文件操作函数**
    • **4. 日志与错误处理**
    • **5. 实用工具函数**
    • **6. 高级函数技巧**
    • **7. 常用函数库示例**
    • **总结:Bash 函数核心要点**

1. 基础函数

1.1 定义与调用

可以自定义函数名称,例如将greet改为yana。❌ 不能以数字开头(如 1greet ),建议全小写+下划线(社区惯例)。

# 定义函数
greet() {echo "Hello, $1!"
}# 调用函数
greet "Alice"  # 输出: Hello, Alice!

1.2 检查数字是否为偶数

# 通过 return 返回状态码(0-255)
is_even() {if (( $1 % 2 == 0 )); thenreturn 0  # 成功(偶数)elsereturn 1  # 失败(奇数)fi
}# 调用并检查返回值
is_even 4 && echo "偶数" || echo "奇数"

2. 参数处理函数

2.1 计算两数之和

sum() {echo $(( $1 + $2 ))
}
sum 3 5  # 输出: 8

2.2 打印所有参数($@

print_args() {for arg in "$@"; doecho "参数: $arg"done
}
print_args "A" "B" "C"
#$@ 指所有参数的列表

2.3 带默认值的问候

greet_user() {local name=${1:-"Guest"}  # 默认值 "Guest"echo "Welcome, $name!"
}
greet_user  # 输出: Welcome, Guest!

3. 文件操作函数

3.1 检查文件是否存在

file_exists() {[ -f "$1" ] && return 0 || return 1
}
file_exists "/etc/passwd" && echo "文件存在"
`||`:如果前一个命令失败(返回非零退出码),则执行后一个命令。
`&&`:如果前一个命令成功(返回零退出码),则执行后一个命令
`return`退出函数,返回值给这个函数;与`exit`的区别是,exit用于关闭所有的文件,结束正在运行的整个程序,他将参数返回给OS(操作系统)。
`return 0`:代表程序正常退出
`return 1`:代表程序异常退出

3.2 创建文件备份

backup_file() {local file="$1"cp -v "$file" "${file}.bak" || return 1
}
backup_file "data.txt"

4. 日志与错误处理

4.1 格式化日志记录

log() {local level=$1local msg=$2echo "[$(date +'%Y-%m-%d %H:%M:%S')] [$level] $msg" >> "/var/log/myscript.log"
}
log "INFO" "脚本启动"

4.2 错误退出脚本

die() {echo "[ERROR] $1" >&2exit 1
}
[ -d "/data" ] || die "目录 /data 不存在"

5. 实用工具函数

5.1 字符串转大写

# 转大写
to_upper() {echo "${1^^}"
}
to_upper "hello"  # 输出: HELLO# 反转字符串
reverse_str() {echo "$1" | rev
}
reverse_str "Bash"  # 输出: hsaB

5.2 网络连通性检查

check_internet() {ping -c1 google.com &>/dev/null && return 0 || return 1
}
check_internet || die "网络连接失败"

6. 高级函数技巧

6.1 函数返回字符串

获取主机名

get_hostname() {echo "$HOSTNAME"  # 通过 stdout 返回
}
host=$(get_hostname)  # 捕获输出

6.2 局部变量(避免污染全局)

统计目录文件数

count_files() {local dir="$1"  # 局部变量ls "$dir" | wc -l
}

6.3 将函数作为参数调用

apply_operation() {local func=$1local arg=$2$func "$arg"
}# 调用
apply_operation to_upper "hello"  # 输出: HELLO

7. 常用函数库示例

utils.sh(可复用的函数库)

检查是否为 root 用户,然后自动安装软件包 。

#!/bin/bash
# 常用函数库# 日志记录
log() {echo "[$(date)] $1"
}# 检查root权限
check_root() {[ "$(id -u)" -eq 0 ] || die "需要root权限"
}# 安装依赖
install_pkg() {local pkg=$1if ! command -v "$pkg" &>/dev/null; thenapt-get install -y "$pkg" || die "安装 $pkg 失败"fi
}

调用方式

source utils.sh
check_root
install_pkg "curl"

总结:Bash 函数核心要点

特性说明
定义语法func_name() { ... }function func_name { ... }
参数传递通过 $1, $2, $@ 获取
返回值通过 return 返回状态码,或通过 echo 输出结果
局部变量使用 local var 避免污染全局作用域
最佳实践函数名小写+下划线,添加注释,优先返回0/1状态码

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

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

相关文章

Python爬虫实战:研究rows库相关技术

1. 引言 在当今数字化时代,互联网上存在着大量有价值的表格数据,这些数据以 HTML 表格、CSV、Excel 等多种格式存在。然而,由于数据源的多样性和不规范性,表格结构往往存在复杂表头、合并单元格、不规则数据行等问题,给数据的自动化处理带来了巨大挑战。 传统的数据处理工…

通过同态加密实现可编程隐私和链上合规

1. 引言 2023年9月28日,a16z 的加密团队发布了 Nakamoto Challenge,列出了区块链中需要解决的最重要问题。尤其是其中的第四个问题格外引人注意:“合规的可编程隐私”,因为Zama团队已经在这方面积极思考了一段时间。本文提出了使…

封装---统一封装处理页面标题

一.采用工具来实现(setPageTitle.ts)多个页面中用更统一的方式设置 document.title,可以封装一个工具函数:在utils目录下新建文件:setPageTitle.ts如果要在每个页面设置相同的网站标志可以使用下面的appNameconst appName: string import.meta.env.VITE_APP_NAMEex…

JAVA学习笔记 首个HelloWorld程序-002

目录 1 前言 2 开发首个程序 3 小结 1 前言 在所有的开发语言中,基本上首先程序就是输出HelloWorld,这里也不例外。这个需要注意的是,程序的核心功能是数据输出,是要有一个结果,可能没有输入,但是一定有…

智慧监所:科技赋能监狱管理新变革

1. 高清教育:告别模糊画面,学习更清晰传统电视的雪花屏终于成为历史!新系统采用高清传输,课件文字清晰可见,教学视频细节分明。某监狱教育科王警官说:"现在播放法律课程,服刑人员能清楚看到…

专题:2025供应链数智化与效率提升报告|附100+份报告PDF、原数据表汇总下载

全文链接:https://tecdat.cn/?p42926 在全球产业链重构与数字技术革命的双重驱动下,供应链正经历从传统经验驱动向数据智能驱动的范式变革。从快消品产能区域化布局到垂类折扣企业的效率竞赛,从人形机器人的成本优化到供应链金融对中小企业的…

uniapp+vue3+ts项目:实现小程序文件下载、预览、进度监听(含项目、案例、插件)

uniapp+vue3+ts项目:实现小程序文件下载、预览、进度监听(含项目、案例、插件) 支持封装调用: 项目采用uniapp+vue3+ts +京东nutUI 开发nutUi文档:loadingPage组件:https://uniapp-nutui.tech/components/exhibition/loadingpage.html案例效果图: 略博主自留地:参考本地…

用Python和OpenCV从零搭建一个完整的双目视觉系统(六 最终篇)

本系列文章旨在系统性地阐述如何利用 Python 与 OpenCV 库,从零开始构建一个完整的双目立体视觉系统。 本项目github地址:https://github.com/present-cjn/stereo-vision-python.git 1. 概述 欢迎来到本系列文章的最后一篇。在过去的几篇文章中&#…

Android View 绘制流程 简述 (无限递归+BitMap问题)

绘制流程 在 Android 的 View 系统中,draw(canvas) 和 dispatchDraw(canvas) 是绘制流程中的两个关键方法: 1. draw(canvas) 方法的作用 draw(canvas) 是 View 类中的核心绘制方法,它的主要职责包括: 绘制背景 - 调用 drawBac…

算法学习笔记:18.拉斯维加斯算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题

在随机化算法领域,拉斯维加斯(Las Vegas)算法以其独特的设计思想占据重要地位。与蒙特卡洛(Monte Carlo)算法不同,拉斯维加斯算法总能给出正确的结果,但运行时间具有随机性 —— 在最坏情况下可…

26-计组-指令执行过程

一、指令周期1. 定义与组成定义:CPU取出并执行一条指令所需的全部时间,称为指令周期。子周期划分:取指周期(必选):从存储器取指令到指令寄存器(IR)。间址周期(可选&#…

【JMeter】数据驱动测试

文章目录创建数据文件加载数据文件根据数据文件请求接口、传递参数拓展含义:根据数据的数量、内容,自动的决定用例的数据和内容。数据驱动测试用例。步骤: 创建数据文件加载数据文件根据数据文件请求接口、传递参数 创建数据文件 Jmeter支…

Springboot实现一个接口加密

首先来看效果这个主要是为了防止篡改请求的。 我们这里采用的是一个AOP的拦截,在有需要这样的接口上添加了加密处理。 下面是一些功能防篡改HMAC-SHA256 参数签名密钥仅客户端 & 服务器持有防重放秒级时间戳 有效窗口校验默认允许 5 分钟防窃听AES/CBC/PKCS5Pa…

斯坦福 CS336 动手大语言模型 Assignment1 BPE Tokenizer TransformerLM

所有代码更新至 https://github.com/WangYuHang-cmd/CS336/tree/main/assignment1-basics 作业文件结构: CS336/assignment1-basics/ ├── tests/ # 测试文件目录 │ ├── adapters.py # 适配器测试 │ ├── conftest.py # pyt…

Spring Cloud Gateway 实战指南

关键词:微服务、API网关、Spring Cloud Gateway、路由转发、限流熔断 ✅ 文章摘要 随着互联网应用规模的不断扩大,传统的单体架构逐渐向微服务架构转型。在微服务架构中,API 网关作为系统的入口点,承担了诸如请求路由、负载均衡、…

PyTorch自动微分:从基础到实战

目录 1. 自动微分是什么? 1.1 计算图 1.2 requires_grad 属性 2. 标量和向量的梯度计算 2.1 标量梯度 2.2 向量梯度 3. 梯度上下文控制 3.1 禁用梯度计算 3.2 累计梯度 4. 梯度下降实战 4.1 求函数最小值 4.2 线性回归参数求解 5. 总结 在深度学习中&a…

Spring AI 项目实战(十六):Spring Boot + AI + 通义万相图像生成工具全栈项目实战(附完整源码)

系列文章 序号文章名称1Spring AI 项目实战(一):Spring AI 核心模块入门2Spring AI 项目实战(二):Spring Boot + AI + DeepSeek 深度实战(附完整源码)3Spring AI 项目实战(三):Spring Boot + AI + DeepSeek 打造智能客服系统(附完整源码)4

从零到一:企业如何组建安全团队

在这个"黑客满天飞,漏洞遍地跑"的时代,没有安全团队的企业就像裸奔的勇士——虽然很有勇气,但结局往往很悲惨。 📋 目录 为什么要组建安全团队安全团队的核心职能团队架构设计人员配置策略技术体系建设制度流程建立实施…

业务访问控制-ACL与包过滤

业务访问控制-ACL与包过滤 ACL的定义及应用场景ACL(Access Control List,访问控制列表)是用来实现数据包识别功能的;ACL可以应用于诸多场景: 包过滤功能:对数据包进行放通或过滤操作。NAT(Netwo…

穿梭时空的智慧向导:Deepoc具身智能如何赋予导览机器人“人情味”

穿梭时空的智慧向导:Deepoc具身智能如何赋予导览机器人“人情味”清晨,当第一缕阳光透过高大的彩绘玻璃窗,洒在博物馆光洁的地板上,一位特别的“馆员”已悄然“苏醒”。它没有制服,却有着清晰的指引;它无需…