Appearance
函数库
创建函数库
基本函数库
bash
#!/bin/bash
# 文件名: mylib.sh
# 日志函数
log() {
local level="$1"
local message="$2"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] [$level] $message"
}
# 信息日志
info() {
log "INFO" "$1"
}
# 警告日志
warn() {
log "WARN" "$1"
}
# 错误日志
error() {
log "ERROR" "$1"
}使用函数库
bash
#!/bin/bash
# 加载函数库
source mylib.sh
# 使用函数库中的函数
info "程序启动"
warn "配置文件不存在"
error "连接失败"函数库结构
按功能分类
bash
#!/bin/bash
# 文件名: utils.sh
# ==============================================
# 日志函数
# ==============================================
log() {
local level="$1"
local message="$2"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] [$level] $message"
}
info() {
log "INFO" "$1"
}
warn() {
log "WARN" "$1"
}
error() {
log "ERROR" "$1"
}
# ==============================================
# 字符串函数
# ==============================================
to_upper() {
echo "$1" | tr '[:lower:]' '[:upper:]'
}
to_lower() {
echo "$1" | tr '[:upper:]' '[:lower:]'
}
string_length() {
echo ${#1}
}
# ==============================================
# 文件函数
# ==============================================
file_exists() {
[ -f "$1" ]
}
create_file() {
local filename="$1"
local content="$2"
echo "${content:-默认内容}" > "$filename"
}
delete_file() {
local filename="$1"
if file_exists "$filename"; then
rm "$filename"
return 0
else
return 1
fi
}
# ==============================================
# 数学函数
# ==============================================
add() {
echo $(($1 + $2))
}
subtract() {
echo $(($1 - $2))
}
multiply() {
echo $(($1 * $2))
}
divide() {
if [ $2 -eq 0 ]; then
echo "错误: 除数不能为 0"
return 1
fi
echo $(($1 / $2))
}加载函数库
使用 source
bash
#!/bin/bash
# 加载函数库
source utils.sh
# 使用函数
info "程序启动"
result=$(add 10 20)
echo "10 + 20 = $result"使用 .
bash
#!/bin/bash
# 加载函数库
. utils.sh
# 使用函数
info "程序启动"
result=$(add 10 20)
echo "10 + 20 = $result"检查函数库是否存在
bash
#!/bin/bash
# 函数库路径
lib_path="utils.sh"
# 检查函数库是否存在
if [ ! -f "$lib_path" ]; then
echo "错误: 函数库不存在: $lib_path"
exit 1
fi
# 加载函数库
source "$lib_path"
# 使用函数
info "程序启动"函数库示例
示例1:日志库
bash
#!/bin/bash
# 文件名: logger.sh
# 日志级别
LOG_LEVEL_DEBUG=0
LOG_LEVEL_INFO=1
LOG_LEVEL_WARN=2
LOG_LEVEL_ERROR=3
# 当前日志级别
CURRENT_LOG_LEVEL=$LOG_LEVEL_INFO
# 设置日志级别
set_log_level() {
CURRENT_LOG_LEVEL=$1
}
# 日志函数
log() {
local level=$1
local message="$2"
if [ $level -ge $CURRENT_LOG_LEVEL ]; then
local level_name
case $level in
$LOG_LEVEL_DEBUG) level_name="DEBUG" ;;
$LOG_LEVEL_INFO) level_name="INFO" ;;
$LOG_LEVEL_WARN) level_name="WARN" ;;
$LOG_LEVEL_ERROR) level_name="ERROR" ;;
esac
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] [$level_name] $message"
fi
}
# 调试日志
debug() {
log $LOG_LEVEL_DEBUG "$1"
}
# 信息日志
info() {
log $LOG_LEVEL_INFO "$1"
}
# 警告日志
warn() {
log $LOG_LEVEL_WARN "$1"
}
# 错误日志
error() {
log $LOG_LEVEL_ERROR "$1"
}示例2:配置库
bash
#!/bin/bash
# 文件名: config.sh
# 配置变量
CONFIG_FILE="/etc/config.conf"
LOG_DIR="/var/log"
MAX_LOG_SIZE=100
LOG_RETENTION_DAYS=30
# 加载配置文件
load_config() {
local config_file="$1"
if [ ! -f "$config_file" ]; then
error "配置文件不存在: $config_file"
return 1
fi
source "$config_file"
info "配置文件加载成功: $config_file"
return 0
}
# 保存配置
save_config() {
local config_file="$1"
cat > "$config_file" << EOF
CONFIG_FILE="$CONFIG_FILE"
LOG_DIR="$LOG_DIR"
MAX_LOG_SIZE=$MAX_LOG_SIZE
LOG_RETENTION_DAYS=$LOG_RETENTION_DAYS
EOF
info "配置文件保存成功: $config_file"
}
# 获取配置
get_config() {
local key="$1"
eval echo \$$key
}
# 设置配置
set_config() {
local key="$1"
local value="$2"
eval "$key=\"$value\""
}示例3:数据库库
bash
#!/bin/bash
# 文件名: db.sh
# 数据库配置
DB_HOST="localhost"
DB_PORT="3306"
DB_USER="root"
DB_PASS="password"
DB_NAME="mydb"
# 连接数据库
db_connect() {
mysql -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME"
}
# 执行查询
db_query() {
local query="$1"
echo "$query" | db_connect
}
# 执行更新
db_update() {
local query="$1"
echo "$query" | db_connect
}
# 备份数据库
db_backup() {
local backup_file="$1"
mysqldump -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$backup_file"
}
# 恢复数据库
db_restore() {
local backup_file="$1"
mysql -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" < "$backup_file"
}示例4:网络库
bash
#!/bin/bash
# 文件名: network.sh
# 检查网络连接
check_connection() {
local host="$1"
if ping -c 1 -W 2 "$host" &> /dev/null; then
return 0
else
return 1
fi
}
# 检查端口
check_port() {
local host="$1"
local port="$2"
if nc -z "$host" "$port" 2>/dev/null; then
return 0
else
return 1
fi
}
# HTTP 请求
http_get() {
local url="$1"
curl -s "$url"
}
# HTTP POST
http_post() {
local url="$1"
local data="$2"
curl -s -X POST -d "$data" "$url"
}
# 下载文件
download_file() {
local url="$1"
local output="$2"
curl -o "$output" "$url"
}使用函数库
示例1:使用日志库
bash
#!/bin/bash
# 加载日志库
source logger.sh
# 设置日志级别
set_log_level $LOG_LEVEL_DEBUG
# 使用日志函数
debug "调试信息"
info "程序启动"
warn "配置文件不存在"
error "连接失败"示例2:使用配置库
bash
#!/bin/bash
# 加载配置库
source config.sh
# 加载配置文件
load_config "config.conf"
# 获取配置
config_file=$(get_config "CONFIG_FILE")
log_dir=$(get_config "LOG_DIR")
max_log_size=$(get_config "MAX_LOG_SIZE")
# 设置配置
set_config "MAX_LOG_SIZE" 200
# 保存配置
save_config "config.conf"示例3:使用数据库库
bash
#!/bin/bash
# 加载数据库库
source db.sh
# 执行查询
result=$(db_query "SELECT * FROM users")
echo "$result"
# 执行更新
db_update "UPDATE users SET name='张三' WHERE id=1"
# 备份数据库
db_backup "backup.sql"
# 恢复数据库
db_restore "backup.sql"示例4:使用网络库
bash
#!/bin/bash
# 加载网络库
source network.sh
# 检查网络连接
if check_connection "www.google.com"; then
echo "网络连接正常"
else
echo "网络连接失败"
fi
# 检查端口
if check_port "localhost" 80; then
echo "端口 80 开放"
else
echo "端口 80 关闭"
fi
# HTTP 请求
result=$(http_get "https://api.example.com/data")
echo "$result"
# 下载文件
download_file "https://example.com/file.txt" "file.txt"最佳实践
1. 函数库命名
bash
# 好的做法
# 文件名: logger.sh
# 文件名: config.sh
# 文件名: db.sh
# 不好的做法
# 文件名: lib.sh
# 文件名: functions.sh
# 文件名: utils.sh2. 函数库注释
bash
# 好的做法
# ==============================================
# 日志函数
# ==============================================
# 不好的做法
# 日志函数3. 函数库版本
bash
# 好的做法
# 文件名: logger.sh
# 版本: 1.0
# 作者: Your Name
# 创建日期: 2024-01-01
# 不好的做法
# 文件名: logger.sh总结
函数库的关键点:
- 创建函数库:将相关函数组织到一个文件中
- 加载函数库:使用
source或.命令 - 函数库结构:按功能分类组织函数
- 实用示例:日志库、配置库、数据库库、网络库
- 最佳实践:合理命名、添加注释、版本管理
下一节我们将学习标准输入输出的使用。