
Linux 基础实战课 ⑩
重复敲了三遍命令,我才想起来能写脚本
Linux基础 实战课
Linux 基础实战课 · 第 10 篇
————————————————
💬 你有没有这种感觉:同样的一串命令,今天敲,明天还要再敲,后天还要敲?
上个月处理 VDI 项目交付,每次新部署一台服务器,都要重复做同样的事:创建用户、配置 sudo 权限、装依赖包、起服务、设开机自启。前三台我都手敲,敲到第四台的时候,同事问我「这个能不能自动化?」我当时心里咯噔一下——这不就是 Shell 脚本干的事吗,我怎么没想到。
一次性的操作用命令。重复的操作写脚本。这篇教你迈出 Shell 脚本的第一步。
————————————————
一、什么是 Shell 脚本?
Shell 脚本就是一个文本文件,里面放的是你平时在终端里敲的命令——只不过现在把它们存下来,一次执行全跑完。
你在终端里能跑的所有命令,放进脚本里都能跑。脚本就是「把操作录下来,随时回放」。
💡 Shell 有很多种(bash、sh、zsh、fish……),Linux 默认最常用的是 bash。脚本第一行写 #!/bin/bash 就是告诉系统「用 bash 来解释这个文件」。
二、写你的第一个脚本
从最简单的开始,创建一个打招呼的脚本:
在 vim 里输入以下内容:
#!/bin/bash echo '===========================' echo 'Hello, Shell Script!' echo '===========================' echo "当前时间:$(date '+%Y-%m-%d %H:%M:%S')" echo "当前用户:$(whoami)" echo "当前目录:$(pwd)" |
保存退出后,赋予执行权限并运行:
chmod +x hello.sh | 加上可执行权限(只需做一次) |
⚠️ 没有 chmod +x 直接跑会报「Permission denied」,这是新手最常见的第一个坑。
三、变量:让脚本动起来
脚本里可以定义变量,把重复用到的内容存起来,改一处全改:
#!/bin/bash APP_NAME="nginx" LOG_DIR="/var/log/${APP_NAME}" echo "应用名称:${APP_NAME}" echo "日志目录:${LOG_DIR}" # 系统内置变量 echo "脚本名:$0" echo "第一个参数:$1" echo "参数总数:$#" |
运行时传参数:
./myscript.sh nginx /etc/nginx | 把 nginx 传给 $1,/etc/nginx 传给 $2 |
💡 变量赋值等号两边不能有空格!APP_NAME="nginx" ✅,APP_NAME = "nginx" ❌,这个坑我踩过好几次。
四、if 判断:根据条件做不同的事
最实用的场景:判断某个服务是不是在跑、目录是不是存在、文件是不是有了:
#!/bin/bash SERVICE="nginx" if systemctl is-active --quiet $SERVICE; then echo"✅ $SERVICE 正在运行" else echo"❌ $SERVICE 未运行,正在启动..." systemctlstart $SERVICE echo"✅ 已启动 $SERVICE" fi |
常用的判断条件:
[ -f /path/to/file ]# 文件是否存在 [ -d /path/to/dir ]# 目录是否存在 [ -z "$VAR" ]# 变量是否为空 [ "$A" = "$B" ]# 字符串是否相等 [ $NUM -gt 0 ]# 数字是否大于 0(gt=greater than) |
⚠️ if 后面的 [ ] 两侧必须有空格,[ -f file ] ✅,[-f file] ❌,否则报语法错误。
五、for 循环:批量操作省掉 90% 重复劳动
这是脚本最强的地方。比如批量检查多台服务器的服务状态:
#!/bin/bash SERVICES=("nginx" "mysql" "redis" "php-fpm") echo "--- 服务状态检查 ---" for service in "${SERVICES[@]}"; do ifsystemctl is-active --quiet $service; then echo"✅ $service: 运行中" else echo"❌ $service: 已停止" fi done |
或者遍历目录下所有文件:
for file in /var/log/nginx/*.log; do echo"处理: $file ($(wc -l < $file) 行)" done |
💡 我在 VDI 批量部署里,用 for 循环遍历服务器 IP 列表,ssh 上去逐台跑初始化脚本——以前手工要两个小时,脚本跑完 10 分钟。
六、实战:服务器初始化脚本
把之前 10 篇学的全串起来,写一个真正能用的初始化脚本:
#!/bin/bash # ========================================== # 服务器初始化脚本 v1.0 # 用法: ./init_server.sh # ========================================== set -e# 遇到错误立即退出 log() { echo "[$(date '+%H:%M:%S')] $1"; } log "开始初始化服务器..." # 1. 更新系统 log "更新软件源..." apt update -q # 2. 安装基础工具 log "安装基础工具..." apt install -y vim curl wget git htop # 3. 创建运维账号 ADMIN_USER="devops" if ! id "$ADMIN_USER" &>/dev/null; then log"创建用户 $ADMIN_USER..." useradd-m -s /bin/bash $ADMIN_USER echo"$ADMIN_USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/$ADMIN_USER fi # 4. 检查关键服务 for svc in nginx mysql; do ifsystemctl is-enabled --quiet $svc 2>/dev/null; then systemctlenable --now $svc log"$svc 已启动并设为自启" fi done log "✅ 初始化完成!" |
💡 脚本开头加 set -e 非常重要——一旦某条命令失败就立刻停下来,避免后面的命令在错误状态下继续跑,防止出现更大的事故。
七、Shell 脚本速查
功能 | 写法 |
脚本开头声明 | #!/bin/bash |
赋予执行权限 | chmod +x script.sh |
执行脚本 | ./script.sh 或 bash script.sh |
定义变量 | NAME="value"(等号无空格) |
读取变量 | ${NAME} 或 $NAME |
读取脚本参数 | $1 $2 ... $# $@ |
命令结果存变量 | RESULT=$(命令) |
if 判断 | if [ 条件 ]; then ... fi |
for 循环 | for i in 列表; do ... done |
遇错退出 | set -e(脚本开头) |
打印信息 | echo "内容" |
注释 | # 这是注释 |
总结
Shell 脚本的核心就三件事:
① 变量 —— 把重复用到的内容存起来
② if 判断 —— 根据条件走不同分支
③ for 循环 —— 批量处理,省掉重复劳动
会了这三样,你就能写出真正能省事的脚本了。至于更高级的 while 循环、函数、正则替换——等你把今天这三样练熟了,自然而然就会想去学。
Linux 基础实战课就到这里收尾了。10 篇下来,从最基础的命令行到能写自动化脚本,这条路你算是走通了。后续我会继续出实战进阶篇,有问题随时评论区见。
————————————————
下篇预告:《定时任务实战:crontab 让服务器在凌晨两点自动帮你干活》
💬 你写过的最省事的脚本是什么?帮你省了多少时间?
评论区分享一下,说不定能给别人一个灵感
👍 点赞💬 留言🔄 转发给需要的朋友
有问题欢迎评论区留言,看到都会回复