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状态码
相关推荐
微学AI7 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
豆瓣鸡8 小时前
算法日记 - Day3
java·开发语言·算法
韭菜炒鸡肝天8 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
Aaron - Wistron9 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
lpfasd1239 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy123931021610 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
05664610 小时前
Python康复训练——常用标准库
开发语言·python·学习
骊城英雄11 小时前
基于C#+avalonia ui实现的跨平台点胶机灌胶监控控制上位机软件
开发语言·ui·c#
吾儿良辰11 小时前
一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析
开发语言·windows·c#
昆曲之源_娄江河畔11 小时前
Python如何安装flask, pymssql
开发语言·python·flask·pymssql