Skip to content

函数库

创建函数库

基本函数库

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.sh

2. 函数库注释

bash
# 好的做法
# ==============================================
# 日志函数
# ==============================================

# 不好的做法
# 日志函数

3. 函数库版本

bash
# 好的做法
# 文件名: logger.sh
# 版本: 1.0
# 作者: Your Name
# 创建日期: 2024-01-01

# 不好的做法
# 文件名: logger.sh

总结

函数库的关键点:

  1. 创建函数库:将相关函数组织到一个文件中
  2. 加载函数库:使用 source. 命令
  3. 函数库结构:按功能分类组织函数
  4. 实用示例:日志库、配置库、数据库库、网络库
  5. 最佳实践:合理命名、添加注释、版本管理

下一节我们将学习标准输入输出的使用。