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状态码 |