Bash函数详解

目录

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

1. 基础函数

1.1 定义与调用

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

bash 复制代码
# 定义函数
greet() {
    echo "Hello, $1!"
}

# 调用函数
greet "Alice"  # 输出: Hello, Alice!

1.2 检查数字是否为偶数

bash 复制代码
# 通过 return 返回状态码(0-255)
is_even() {
    if (( $1 % 2 == 0 )); then
        return 0  # 成功(偶数)
    else
        return 1  # 失败(奇数)
    fi
}

# 调用并检查返回值
is_even 4 && echo "偶数" || echo "奇数"

2. 参数处理函数

2.1 计算两数之和

bash 复制代码
sum() {
    echo $(( $1 + $2 ))
}
sum 3 5  # 输出: 8

2.2 打印所有参数($@

bash 复制代码
print_args() {
    for arg in "$@"; do
        echo "参数: $arg"
    done
}
print_args "A" "B" "C"
#$@ 指所有参数的列表

2.3 带默认值的问候

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

3. 文件操作函数

3.1 检查文件是否存在

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

3.2 创建文件备份

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

4. 日志与错误处理

4.1 格式化日志记录

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

4.2 错误退出脚本

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

5. 实用工具函数

5.1 字符串转大写

bash 复制代码
# 转大写
to_upper() {
    echo "${1^^}"
}
to_upper "hello"  # 输出: HELLO

# 反转字符串
reverse_str() {
    echo "$1" | rev
}
reverse_str "Bash"  # 输出: hsaB

5.2 网络连通性检查

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

6. 高级函数技巧

6.1 函数返回字符串

获取主机名

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

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

统计目录文件数

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

6.3 将函数作为参数调用

bash 复制代码
apply_operation() {
    local func=$1
    local arg=$2
    $func "$arg"
}

# 调用
apply_operation to_upper "hello"  # 输出: HELLO

7. 常用函数库示例

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

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

bash 复制代码
#!/bin/bash
# 常用函数库

# 日志记录
log() {
    echo "[$(date)] $1"
}

# 检查root权限
check_root() {
    [ "$(id -u)" -eq 0 ] || die "需要root权限"
}

# 安装依赖
install_pkg() {
    local pkg=$1
    if ! command -v "$pkg" &>/dev/null; then
        apt-get install -y "$pkg" || die "安装 $pkg 失败"
    fi
}

调用方式

bash 复制代码
source utils.sh
check_root
install_pkg "curl"

总结:Bash 函数核心要点

特性 说明
定义语法 func_name() { ... }function func_name { ... }
参数传递 通过 $1, $2, $@ 获取
返回值 通过 return 返回状态码,或通过 echo 输出结果
局部变量 使用 local var 避免污染全局作用域
最佳实践 函数名小写+下划线,添加注释,优先返回0/1状态码
相关推荐
码海踏浪7 分钟前
JMeter 时间函数合集
开发语言·python
麦麦鸡腿堡8 分钟前
Java_反射暴破创建对象与访问类中的成员
java·开发语言
不会c嘎嘎8 分钟前
深入理解QT之信号和槽
开发语言·qt
SunnyDays10119 分钟前
Python 实现 PDF 文档压缩:完整指南
linux·开发语言·python
Cx330❀9 分钟前
《C++ 动态规划》第001-002题:第N个泰波拉契数,三步问题
开发语言·c++·算法·动态规划
神仙别闹10 分钟前
基于Qt5(C++)+SQLite 开发的一个小巧精美的本地音乐播放器
开发语言·c++·qt
差点GDP12 分钟前
C语言常用编译命令和示例
c语言·开发语言
weixin_3077791314 分钟前
Jenkins Pipeline: Input Step插件详解与实践指南
运维·开发语言·自动化·jenkins·etl
宵时待雨16 分钟前
C语言笔记归纳21:编译与链接
linux·c语言·开发语言·笔记
天勤量化大唯粉17 分钟前
基于距离的配对交易策略:捕捉价差异常偏离的均值回归机会(天勤量化代码实现)
android·开发语言·python·算法·kotlin·开源软件·策略模式