当前位置: 首页 > news >正文

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.dtcms.com/a/274232.html

相关文章:

  • 软件开发那些基础事儿:需求、模型与生命周期
  • MySQL锁的分类
  • Linux驱动学习day22(interrupt子系统)
  • spring-boot项目集成spring-ai
  • TCP服务端处理HTT
  • V少JS基础班之第七弹
  • 【Linux】GDB/CGDB 调试器学习笔记
  • 【Git】git的回退功能
  • map数据结构在Golang中是无序的,并且键值对的查找效率较高的原因
  • pyQt基础4(对话框)
  • 力扣 hot100 Day41
  • OS16.【Linux】冯依诺曼体系结构和操作系统的浅层理解
  • 深度学习×第8卷:优化器与训练流程进阶——她开始跑起来,学着一次次修正自己
  • 聊聊AI大模型的上下文工程(Context Engineering)
  • linux网络编程之单reactor模型(一)
  • 渗透测试之木马后门实验
  • 笔记 | 理解C/汇编中的数组元素访问
  • UNIX 域套接字实现本地进程间通信
  • 【React Native】样式、网络请求和Loading
  • Hadoop 用户入门指南:驾驭大数据的力量
  • 【React Native】原生组件
  • Dify 1.5.0,1.5.1,1.6.0 新特性
  • 小旺AI截图×英特尔强强联合:AIPC生态开启智能生产力新纪元
  • C++设计秘籍:为什么所有参数都需类型转换时,非成员函数才是王道?
  • 基于强化学习的智能推荐系统优化实践
  • 继续Java的jpackage模块打包Linux可执行程序(包含第三方非模块化包)
  • 4G Cat.1 时代,如何选对 DTU?
  • IoC 是如何为 Spring 的其他核心功能(如 AOP、事务管理)提供基础支持的
  • openpilot:为您的汽车插上智能驾驶的翅膀
  • CV目标检测中的LetterBox操作