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状态码
相关推荐
Sylvia-girl1 小时前
Java——抽象类
java·开发语言
kfepiza4 小时前
Debian-10编译安装Mysql-5.7.44 笔记250706
linux·数据库·笔记·mysql·debian·bash
tomorrow.hello5 小时前
Java并发测试工具
java·开发语言·测试工具
晓13135 小时前
JavaScript加强篇——第四章 日期对象与DOM节点(基础)
开发语言·前端·javascript
老胖闲聊5 小时前
Python I/O 库【输入输出】全面详解
开发语言·python
她说人狗殊途7 小时前
java.net.InetAddress
java·开发语言
天使day7 小时前
Cursor的使用
java·开发语言·ai
Dxy12393102167 小时前
Python ExcelWriter详解:从基础到高级的完整指南
开发语言·python
源代码•宸9 小时前
C++高频知识点(十三)
开发语言·c++·经验分享·面经