linux下的shell脚本(基本)

119 阅读2分钟

🐚 Linux Shell 脚本基础

1️⃣ 什么是 Shell 脚本

  • Shell:Linux 下的命令解释器(常见 bash、sh、zsh)
  • Shell 脚本:由一系列命令组成的文本文件,用来自动化任务
  • 文件扩展名:通常 .sh

2️⃣ 创建和运行 Shell 脚本

1. 创建文件

touch script.sh
chmod +x script.sh  # 添加可执行权限

2. 编写脚本示例

#!/bin/bash
# 这是一个注释
echo "Hello, Linux Shell!"
  • #!/bin/bash:指定脚本使用 bash 解释器
  • echo:输出文本

3. 运行脚本

./script.sh
# 或者
bash script.sh

3️⃣ 变量

# 定义变量
name="阿杰"
age=25
 
# 使用变量
echo "姓名: $name, 年龄: $age"
  • 变量名不要有空格
  • 使用 $ 来引用变量

4️⃣ 读取用户输入

read -p "请输入你的名字: " username
echo "你好, $username!"

5️⃣ 条件判断

if 语句

num=10
if [ $num -gt 5 ]; then
    ``echo "大于5"
else
    ``echo "小于等于5"
fi
  • 常用比较符号:
符号含义
-eq等于
-ne不等于
-gt大于
-lt小于
-ge大于等于
-le小于等于

case 语句

fruit="apple"
case $fruit in
    ``"apple")
        ``echo "这是苹果";;
    ``"banana")
        ``echo "这是香蕉";;
    ``*)
        ``echo "未知水果";;
esac

6️⃣ 循环

for 循环

for i in 1 2 3 4 5
do
    ``echo "循环次数: $i"
done
  • 也可用范围:
for i in {1..5}; do echo $i; done

while 循环

count=1
while [ $count -le 5 ]
do
    ``echo "计数: $count"
    ``count=$((count + 1))
done

7️⃣ 函数

greet() {
    ``echo "Hello, $1"
}
 
greet "阿杰"  # 调用函数并传参

8️⃣ 文件和目录操作

# 创建目录
mkdir test_dir
 
# 创建文件
touch test_dir/file.txt
 
# 写入文件
echo "Hello" > test_dir/file.txt
 
# 追加写入
echo "World" >> test_dir/file.txt
 
# 读取文件
cat test_dir/file.txt

9️⃣ 脚本调试

bash -x script.sh   # 显示每条命令执行过程

10️⃣ 综合示例:备份脚本

#!/bin/bash
# 备份 home 目录到 /backup
 
SRC="/home/username"
DEST="/backup/home_backup_$(date +%F).tar.gz"
 
tar -czf $DEST $SRC
 
echo "备份完成: $DEST"
  • 自动生成日期
  • 压缩备份目录

👌 好的,阿杰,我帮你整理一个 Linux 高级 Shell 脚本示例集,涵盖自动化部署、日志分析、文件批量处理、条件报警,以及循环和函数的综合应用。


🐚 Linux 高级 Shell 脚本示例集


1️⃣ 自动化部署示例

功能:自动拉取 Git 仓库代码并重启服务

#!/bin/bash
# 自动部署脚本
 
APP_DIR="/var/www/myapp"
GIT_REPO="git@github.com:username/myapp.git"
SERVICE_NAME="myapp.service"
 
echo "开始部署..."

| cd $APP_DIR || exit | | ----------------------- |

git fetch --all
git reset --hard origin/main
git pull
 
echo "重启服务..."
sudo systemctl restart $SERVICE_NAME
 
echo "部署完成!"
  • 用途:自动更新应用代码并重启服务
  • 结合 cron,可定时自动部署

2️⃣ 日志分析示例

功能:统计 Apache 日志中 404 错误访问次数

#!/bin/bash
LOG_FILE="/var/log/apache2/access.log"

| ERROR_COUNT=$(grep " 404 " $LOG_FILE | wc -l) | | ------------------------------------------------ |

echo "当前 404 错误次数: $ERROR_COUNT"
 
# 输出出现最多的 5 个请求 URL
echo "Top 5 404 URL:"

| grep " 404 " $LOG_FILE | awk '{print $7}' | sort | uniq -c | sort -nr | head -5 | | -------------------------------------------------------------------------------------- |

  • 用途:快速定位网站错误
  • 可结合 crontab 自动每日统计

3️⃣ 文件批量处理示例

功能:批量重命名目录下所有 .txt 文件

#!/bin/bash
DIR="/home/username/docs"
COUNTER=1
 
for FILE in $DIR/*.txt; do
    ``BASENAME=$(basename "$FILE")
    ``mv "$FILE" "$DIR/file_$COUNTER.txt"
    ``((COUNTER++))
done
 
echo "批量重命名完成"
  • 用途:整理大量文件
  • 结合正则表达式,可处理复杂命名规则

4️⃣ 条件报警示例

功能:监控磁盘使用率,超过阈值发送邮件

#!/bin/bash
THRESHOLD=80
MAIL="admin@example.com"
 

| USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//') | | ------------------------------------------------------------- |

 
if [ "$USAGE" -gt "$THRESHOLD" ]; then

|     ``echo "磁盘使用率警告: $USAGE%" | mail -s "Disk Alert" $MAIL | | ------------------------------------------------------------- |

fi
  • 用途:服务器监控
  • 可结合 cron 定期检查

5️⃣ 循环与函数综合应用示例

功能:批量检查服务状态,并自动重启未运行服务

#!/bin/bash
SERVICES=("nginx" "mysql" "redis")
 
check_service() {
    ``local svc=$1
    ``systemctl is-active --quiet $svc
    ``if [ $? -ne 0 ]; then
        ``echo "$svc 未运行,正在重启..."
        ``sudo systemctl restart $svc
    ``else
        ``echo "$svc 正常运行"
    ``fi
}
 
for svc in "${SERVICES[@]}"; do
    ``check_service $svc
done
  • 用途:服务器运维自动化
  • 使用函数封装逻辑,循环遍历服务

6️⃣ 综合示例:自动备份 + 日志记录 + 邮件通知

#!/bin/bash
SRC="/home/username/data"
DEST="/backup/data_$(date +%F).tar.gz"
LOG="/var/log/backup.log"
MAIL="admin@example.com"
 
tar -czf $DEST $SRC
if [ $? -eq 0 ]; then
    ``echo "$(date) - 备份成功: $DEST" >> $LOG

|     ``echo "备份成功: $DEST" | mail -s "Backup Success" $MAIL | | ------------------------------------------------------------ |

else
    ``echo "$(date) - 备份失败" >> $LOG

|     ``echo "备份失败" | mail -s "Backup Failed" $MAIL | | ---------------------------------------------------- |

fi
  • 自动压缩数据目录
  • 日志记录备份状态
  • 邮件通知管理员

✅ 总结

这个高级脚本集展示了:

  • 自动化部署、日志分析、文件批量处理、条件报警
  • 循环、条件判断和函数综合应用
  • 可以与 cron 作业 配合,实现定时任务
  • 适合 服务器运维、系统管理、自动化运维脚本

www.52runoob.com/archives/68…