Shell脚本中常用的自定义函数

本文整理了Shell脚本中常用的自定义函数,涵盖文件操作、系统监控、网络管理、用户交互等场景,每个函数均提供详细注释,助力提升脚本开发效率。

基础文件操作

文件/目录存在性检查

1
2
3
4
5
6
7
8
9
10
11
12
13
# 检查文件是否存在
# 参数: $1 文件路径
# 返回值: 输出存在性状态
file_exists() {
[ -f "$1" ] && echo "✅ File exists." || echo "❌ File does not exist."
}

# 检查目录是否存在
# 参数: $1 目录路径
# 返回值: 输出存在性状态
dir_exists() {
[ -d "$1" ] && echo "📂 Directory exists." || echo "📂 Directory does not exist."
}

文件属性获取

1
2
3
4
5
6
7
8
9
10
11
12
13
# 获取文件大小(带单位)
# 参数: $1 文件路径
# 返回值: 文件大小(如 2.5M)
get_file_size() {
du -sh "$1" 2>/dev/null | awk '{print $1}'
}

# 获取目录中最后修改的文件名
# 参数: $1 目录路径
# 返回值: 最新文件名
last_modified_file() {
ls -t "$1" 2>/dev/null | head -n 1
}

系统信息查询

系统状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 检查当前用户是否为root
# 返回值: 输出用户权限状态
is_root() {
[ "$(id -u)" -eq 0 ] && echo "👑 Root user" || echo "🚫 Not root user"
}

# 获取当前主机的IP地址
# 返回值: 输出第一个IP地址
get_ip() {
hostname -I | awk '{print $1}'
}

# 获取系统负载
# 返回值:1分钟/5分钟/15分钟的系统负载
system_load() {
uptime | awk -F'load average:' '{print $2}' | xargs
}

资源监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 获取内存使用率百分比
# 返回值: 如 45.2%
memory_usage() {
free | awk '/Mem/{printf("%.1f%%"), ($3/$2)*100}'
}

# 获取CPU总使用率(用户+系统)
# 返回值: 如 15.5
cpu_usage() {
top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}'
}

# 检查磁盘使用率是否超过阈值
# 参数: $1 路径, $2 阈值(默认80)
# 返回值: 告警或正常状态
check_disk_space() {
threshold=${2:-80}
usage=$(df -h "$1" 2>/dev/null | awk 'NR==2{print $5}' | cut -d'%' -f1)
[ "$usage" -ge "$threshold" ] && echo "⚠️ Disk over $threshold%: $usage%" || echo "✅ OK ($usage%)"
}

时间与日期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 获取当前日期(YYYY-MM-DD)
# 返回值: 当前日期字符串(如:2019-08-11)
current_date() {
date +"%Y-%m-%d"
}

# 获取当前时间(HH:MM:SS)
# 返回值: 当前时间字符串(如:14:30:45)
current_time() {
date +"%H:%M:%S"
}

# 计算日期差(天数)
# 参数:
# $1:起始日期(格式:YYYY-MM-DD 或其他 date 支持的格式)
# $2:结束日期(格式同上,默认为当前日期)
# 返回值:天数差(正数表示结束日期在后,负数反之)
# 示例:
# date_diff "2019-01-01" "2019-01-10" → 9
date_diff() {
from=$(date -d "$1" +%s)
to=$(date -d "$2" +%s)
echo $(( (to - from)/(60*60*24) ))
}

日志与备份和分析

1
2
3
4
5
6
7
8
9
10
# 备份文件(自动添加时间戳后缀)
backup_file() {
cp -v "$1" "${1}_$(date +%Y%m%d_%H%M%S).bak" 2>/dev/null
}

# 记录日志到指定文件
log_message() {
local log_file=${2:-/var/log/myapp.log}
echo "[$(date +%Y-%m-%d\ %H:%M:%S)] $1" >> "$log_file"
}

网络与服务管理

网络连通性

1
2
3
4
5
6
7
8
9
10
11
12
13
# 检查目标主机是否可达
# 参数: $1 主机名或IP
# 返回值: 可达性状态
ping_check() {
ping -c 1 "$1" &> /dev/null && echo "✅ $1 reachable" || echo "❌ unreachable";
}

# 获取HTTP状态码
# 参数: $1 URL
# 返回值: 状态码(如 200)
http_status() {
curl -s -o /dev/null -w "%{http_code}" "$1";
}

端口与服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 检查端口是否开放
# 参数: $1 端口号
# 返回值: 端口状态
is_port_open() {
ss -tuln | grep -q ":$1\b" && echo "✅ Port $1 is open" || echo "❌ Port $1 is closed"
}

# 检查服务是否运行
# 参数: $1 服务名
# 返回值: 服务状态
service_status() {
systemctl is-active --quiet "$1" && echo "🟢 $1 is running" || echo "🔴 $1 is stopped"
}

# 重启服务并反馈结果
# 参数: $1 服务名
# 返回值: 服务状态
restart_service() {
systemctl restart "$1" && echo "🚀 Service $1 restarted" || echo "❌ Failed to restart $1"
}

用户交互与验证

确认提示

1
2
3
4
5
6
7
8
# 交互式确认提示
# 参数: $1 提示文本
# 返回值: 用户输入y/n后返回0/1
confirm() {
read -p "$1 确认(y/n) " -n 1 -r
echo
[[ $REPLY =~ ^[Yy]$ ]] || exit 1
}

参数验证函数

1
2
3
4
5
6
# 强制要求脚本必须传入参数
# 用途: 用于检查脚本是否缺少必需参数
# 触发条件: 当$#为0时退出脚本并报错
require_arg() {
[ $# -eq 0 ] && echo "❌ Missing argument" && exit 1
}

进程管理

进程操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 根据进程名模糊查找PID
# 参数: $1 进程名(支持模糊匹配)
# 返回值: PID列表或提示信息
# 示例:find_pid "nginx" # 输出: 1234 5678(多个PID)
find_pid() {
pgrep -f "$1" || echo "PID not found"
}

# 终止指定PID的进程
# 参数: $1 进程PID
# 注意: 默认发送SIGTERM信号
# 示例:kill_process 1234 # 输出: ✅ Killed 1234
kill_process() {
kill "$1" && echo "✅ Killed $1" || echo "❌ Failed"
}

压缩与解压

压缩函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 将文件/目录压缩为tar.gz格式
# 参数: $1 目标路径(文件或目录)
# 输出: 生成同名.tar.gz文件
# 示例: tar_compress "/var/log/nginx" # 生成/var/log/nginx.tar.gz
tar_compress() {
tar -czf "${1}.tar.gz" -C "$(dirname "$1")" "$(basename "$1")"
}

# 解压tar.gz文件到指定目录
# 参数:
# $1 压缩文件路径
# $2 解压目录(默认当前目录)
# 示例:tar_decompress "backup.tar.gz" "/tmp" # 解压到/tmp目录
tar_decompress() {
tar -xzf "$1" -C "${2:-.}"
}

权限与安全

权限控制函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 设置文件/目录权限
# 参数:
# $1 目标路径
# $2 权限模式(默认755)
set_permissions() {
chmod "${2:-755}" "$1" && echo "✅ Permissions set" || echo "❌ Failed"
}

# 修改文件所有者
# 参数:
# $1 用户名
# $2 用户组
# $3 目标路径
change_owner() {
chown "${1}:${2}" "$3" && echo "✅ Ownership changed" || echo "❌ Failed"
}

增强功能函数

彩色输出与提示

1
2
3
4
5
6
7
8
9
10
11
# 打印彩色文本(支持红/绿/黄/蓝)
print_color() {
local text=$1 color=$2
case $color in
red) echo -e "\033[31m$text\033[0m" ;;
green) echo -e "\033[32m$text\033[0m" ;;
yellow) echo -e "\033[33m$text\033[0m" ;;
blue) echo -e "\033[34m$text\033[0m" ;;
*) echo "$text" ;;
esac
}

安全与随机化

1
2
3
4
5
6
7
# 生成随机字符串
# 参数: $1 长度(默认10)
# 返回值: 随机字符串(字母+数字)
generate_random_string() {
length=${1:-10}
tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w "$length" | head -n 1
}

参数验证

1
2
3
4
5
6
7
8
9
10
# 检查命令是否存在
command_exists() {
command -v "$1" >/dev/null 2>&1 && return 0 || return 1
}

# 函数参数验证示例
safe_function() {
[ $# -ne 1 ] && echo "❌ Usage: $0 <arg>" && exit 1
# 主体逻辑...
}