当前位置:首页>Linux>Linux 基础实战课 ⑩重复敲了三遍命令,我才想起来能写脚本

Linux 基础实战课 ⑩重复敲了三遍命令,我才想起来能写脚本

  • 2026-10-05 01:43:49
Linux 基础实战课 ⑩重复敲了三遍命令,我才想起来能写脚本

Linux 基础实战课 ⑩

重复敲了三遍命令,我才想起来能写脚本

Linux基础  实战课 

Linux 基础实战课 · 第 10 篇

————————————————

请在微信客户端打开

💬 你有没有这种感觉:同样的一串命令,今天敲,明天还要再敲,后天还要敲?

上个月处理 VDI 项目交付,每次新部署一台服务器,都要重复做同样的事:创建用户、配置 sudo 权限、装依赖包、起服务、设开机自启。前三台我都手敲,敲到第四台的时候,同事问我「这个能不能自动化?」我当时心里咯噔一下——这不就是 Shell 脚本干的事吗,我怎么没想到。

一次性的操作用命令。重复的操作写脚本。这篇教你迈出 Shell 脚本的第一步。

————————————————

一、什么是 Shell 脚本?

Shell 脚本就是一个文本文件,里面放的是你平时在终端里敲的命令——只不过现在把它们存下来,一次执行全跑完。

你在终端里能跑的所有命令,放进脚本里都能跑。脚本就是「把操作录下来,随时回放」。

💡 Shell 有很多种(bash、sh、zsh、fish……),Linux 默认最常用的是 bash。脚本第一行写 #!/bin/bash 就是告诉系统「用 bash 来解释这个文件」。

二、写你的第一个脚本

从最简单的开始,创建一个打招呼的脚本:

vim hello.sh

创建脚本文件

在 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

加上可执行权限(只需做一次)

./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 让服务器在凌晨两点自动帮你干活》

💬 你写过的最省事的脚本是什么?帮你省了多少时间?

评论区分享一下,说不定能给别人一个灵感

👍 点赞💬 留言🔄 转发给需要的朋友

有问题欢迎评论区留言,看到都会回复

最新文章

随机文章