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 次"
done

Linux 笑话

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


节点链接

上游(脚本需要这些基础)

  • nano ← 写脚本的工具
  • chmod ← chmod +x 让脚本可执行
  • 管道 ← 脚本里大量使用管道
  • find ← 脚本里用 find 搜文件
  • grep ← 脚本里用 grep 判断条件

下游(脚本是这些的基础)

  • cron ← 定时自动运行脚本
  • systemctl ← 把脚本注册为开机服务

实战


节点版本:v1.0 · 2026-04-20 下一个节点建议:cronsystemctl