shell脚本合集
shell 脚本使用合集
最近写了个打印日志的shell 记录一下;
#!/bin/bash
# 涵盖大部分使用场景
# 1. 基础配置与颜色配置(提升可读性)
# 定义颜色变量,方便后续输出高亮信息
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color (重置颜色)
# 开启严格模式 (最佳实践:遇到错误立即停止,防止错误扩散)
set -euo pipefail
# 定义日志函数
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# ------------------------------------------------------------------------------
# 2. 变量与数据类型
# ------------------------------------------------------------------------------
demo_variables() {
log_info ">>> 进入模块:变量与字符串操作"
# 定义变量 (注意:等号两边不能有空格)
local name="ShellMaster"
local version=1.0
local is_active=true
# 字符串拼接
local greeting="Hello, ${name}!"
# 获取命令执行结果 (命令替换)
local current_date=$(date +%Y-%m-%d)
local current_dir=$(pwd)
# 数组的使用
local fruits=("Apple" "Banana" "Cherry")
echo "--------------------------"
echo "问候语: $greeting"
echo "日期: $current_date"
echo "当前目录: $current_dir"
echo "数组第二个元素: ${fruits[1]}" # 数组索引从0开始
echo "数组所有元素: ${fruits[@]}"
echo "--------------------------"
}
# ------------------------------------------------------------------------------
# 3. 参数解析 (处理命令行参数)
# ------------------------------------------------------------------------------
demo_arguments() {
log_info ">>> 进入模块:参数解析"
# 这是一个演示函数,实际运行时通过 ./script.sh -u user -v 调用
# 使用 getopts 处理标准参数 (-u username -v -h)
local username=""
local verbose=false
# 重置 getopts 索引
OPTIND=1
# h: help, u: user (需要参数), v: verbose (不需要参数)
while getopts "h?u:v" opt; do
case "$opt" in
h|\?)
echo "用法: $0 [-u 用户名] [-v]"
return 0
;;
u) username=$OPTARG
;;
v) verbose=true
;;
esac
done
# 偏移参数,让 $1 指向非选项参数
shift $((OPTIND-1))
if [ -n "$username" ]; then
log_success "指定用户: $username"
else
log_warn "未指定用户,使用默认用户"
fi
if [ "$verbose" = true ]; then
log_info "详细模式已开启"
fi
}
# ------------------------------------------------------------------------------
# 4. 流程控制 (If/Case)
# ------------------------------------------------------------------------------
demo_conditions() {
log_info ">>> 进入模块:条件判断"
local score=85
# If-Else 结构
if [ "$score" -ge 90 ]; then
log_success "等级: A (优秀)"
elif [ "$score" -ge 80 ]; then
log_info "等级: B (良好)"
elif [ "$score" -ge 60 ]; then
log_warn "等级: C (及格)"
else
log_error "等级: D (不及格)"
fi
# 文件判断 (常见场景)
local test_file="./test_temp.txt"
# 创建临时文件用于测试
touch "$test_file"
if [ -f "$test_file" ]; then
log_success "文件 $test_file 存在且是普通文件"
fi
if [ ! -d "$test_file" ]; then
log_info "$test_file 不是一个目录"
fi
# 清理测试文件
rm "$test_file"
# Case 结构 (类似于 Switch)
local os_type=$(uname -s)
case "$os_type" in
Linux)
log_info "操作系统: Linux"
;;
Darwin)
log_info "操作系统: macOS"
;;
*)
log_warn "操作系统: 其他 ($os_type)"
;;
esac
}
# ------------------------------------------------------------------------------
# 5. 循环结构 (For/While)
# ------------------------------------------------------------------------------
demo_loops() {
log_info ">>> 进入模块:循环结构"
# C语言风格的 For 循环
log_info "--- C风格 For 循环 ---"
for ((i=1; i<=3; i++)); do
echo "计数: $i"
done
# 遍历列表/数组
log_info "--- 遍历数组 ---"
local servers=("Web" "DB" "Cache")
for server in "${servers[@]}"; do
echo "正在检查服务: $server ..."
# sleep 0.1 # 模拟耗时操作
done
# While 循环 (读取文件或持续监控)
log_info "--- While 循环 ---"
local count=1
while [ $count -le 3 ]; do
echo "While 循环次数: $count"
((count

浙公网安备 33010602011771号