shell script · 自动化脚本
上游:nano(用 nano 写脚本)· chmod(脚本必须 +x 才能运行)· 管道(脚本里大量用管道) 下游:cron(把脚本加入定时任务)· systemctl(把脚本注册为系统服务) 参见:nano(写脚本的工具)· chmod(给脚本加权限)
一句话是什么
Shell 脚本把一系列命令写进一个文件,一次运行就自动执行全部—— 就像把你每天重复做的事情录进一个按钮,按一下全部搞定。
为什么需要它
你现在启动 Minecraft 服务器要这样:
cd ~/mc-server
./bedrock_server你备份存档要这样:
tar -czf ~/备份/mc-存档-$(date +%Y%m%d).tar.gz ~/mc-server/worlds/每次都手动输这些,太麻烦了。脚本让你只需要:
./start.sh # 一键启动服务器
./backup.sh # 一键备份存档核心用法
脚本的结构
#!/bin/bash ← 第一行:告诉系统用 bash 来运行这个文件
# 这是注释,#号开头,不会被执行
命令1
命令2
命令3#!/bin/bash 叫做 shebang,是每个脚本的”身份证”,必须是第一行。
基本写法速查
# 变量
名字="Aaron"
echo "你好,$名字" # 输出:你好,Aaron
# 命令结果存进变量
今天=$(date +%Y%m%d)
echo "今天是 $今天"
# 条件判断
if [ -f ~/mc-server/bedrock_server ]; then
echo "服务器程序存在"
else
echo "找不到服务器程序!"
fi
# 循环
for i in 1 2 3; do
echo "第 $i 次"
doneLinux 笑话
Aaron 第一次写脚本,文件名叫 我的第一个脚本.sh。
运行的时候:
./我的第一个脚本.sh
bash: ./我的第一个脚本.sh: No such file or directory他检查了三遍,文件明明在那里。
爸爸看了一眼,说: “文件名里有空格和中文,用引号包起来,或者改个英文名。”
./"我的第一个脚本.sh"
# 或者
mv "我的第一个脚本.sh" start.sh
./start.sh成功运行。
Linux 脚本文件名的行规:只用英文、数字、下划线、短横线,不用空格。 不是不能用,是每次用都要加引号,太麻烦。
例题精讲
📗 初探 Starter — 写第一个脚本
# 第一步:用 nano 创建脚本
nano ~/mc-server/hello.sh
# 写入以下内容:
#!/bin/bash
echo "=== Minecraft 服务器状态检查 ==="
echo "当前时间:$(date)"
echo "服务器目录:"
ls -la ~/mc-server/
echo "存档目录:"
ls ~/mc-server/worlds/ 2>/dev/null || echo "(还没有存档)"
# 保存退出(Ctrl+O → Enter → Ctrl+X)
# 第二步:加执行权限
chmod +x ~/mc-server/hello.sh
# 第三步:运行
~/mc-server/hello.sh📘 应用 User — 一键启动 Minecraft 服务器
# 创建启动脚本
nano ~/mc-server/start.sh
# 内容:
#!/bin/bash
SERVER_DIR=~/mc-server
# 检查服务器程序是否存在
if [ ! -f "$SERVER_DIR/bedrock_server" ]; then
echo "❌ 找不到 bedrock_server,请检查路径"
exit 1
fi
# 检查是否已经在运行
if ps aux | grep -q "[b]edrock_server"; then
echo "⚠️ 服务器已经在运行中"
exit 1
fi
echo "🎮 启动 Minecraft Bedrock Server..."
cd "$SERVER_DIR"
# LD_LIBRARY_PATH=. 告诉系统去当前目录找 bedrock_server 需要的 .so 共享库
# 官方 start.sh 就是这么写的,不加会报 "error while loading shared libraries"
LD_LIBRARY_PATH=. ./bedrock_server
# 保存退出
chmod +x ~/mc-server/start.sh
# 运行
~/mc-server/start.sh📙 管理 Admin — 自动备份存档脚本
nano ~/mc-server/backup.sh
# 内容:
#!/bin/bash
SERVER_DIR=~/mc-server
BACKUP_DIR=~/mc-backups
DATE=$(date +%Y%m%d-%H%M)
# 创建备份目录(如果不存在)
mkdir -p "$BACKUP_DIR"
echo "📦 开始备份 Minecraft 存档..."
# 打包存档
tar -czf "$BACKUP_DIR/mc-worlds-$DATE.tar.gz" \
"$SERVER_DIR/worlds/" \
"$SERVER_DIR/server.properties"
# 检查是否成功
if [ $? -eq 0 ]; then
echo "✅ 备份成功:$BACKUP_DIR/mc-worlds-$DATE.tar.gz"
else
echo "❌ 备份失败!"
exit 1
fi
# 只保留最近 7 个备份,删除更早的
ls -t "$BACKUP_DIR"/mc-worlds-*.tar.gz | tail -n +8 | xargs rm -f 2>/dev/null
echo "🧹 旧备份清理完成,保留最近 7 个"
# 保存退出
chmod +x ~/mc-server/backup.sh$? 是什么:上一条命令的退出码,0 = 成功,非 0 = 失败。
官方文档参考
man bash # 完整 bash 手册(很长)
bash --help # 快速选项Shell 脚本就是批量 bash 命令的文本文件;
$?是退出码,$()是命令替换,$变量名是取值。 入门教程:https://www.gnu.org/software/bash/manual/bash.html
节点链接
上游(脚本需要这些基础)
下游(脚本是这些的基础)
实战
- Minecraft-Bedrock-Server ← start.sh + backup.sh 就是这一节的成果