在Linux运维和开发工作中,我们经常会遇到重复执行的操作——比如每天备份日志、批量创建文件、检查服务状态、部署项目等。如果每次都手动敲命令,不仅耗时费力,还容易出错。
Shell脚本就是解决这个问题的:它是一系列Linux命令的有序集合,将重复的操作写成一个脚本文件,执行一次脚本,就能自动完成所有步骤,实现自动化办公。
Shell脚本的核心用途:
自动化部署:一键部署项目、安装依赖,替代手动执行一系列部署命令;
日志管理:定时备份日志、清理过期日志,避免日志占满磁盘;
批量处理:批量创建/删除文件、批量修改文件名、批量执行命令;
服务监控:定时检查服务运行状态,异常时自动重启或发送告警;
系统维护:磁盘、内存监控,系统信息采集,自动化完成日常维护工作。
一句话总结:Shell脚本是Linux运维的“必备技能”,能自动化的绝不手动敲,学会它能极大提升工作效率,摆脱重复劳动。
Shell脚本的后缀名通常为 .sh(虽然后缀不影响执行,但规范命名能方便识别),使用vim创建脚本:
# 进入家目录(方便管理脚本,也可自定义路径)cd ~# 创建脚本文件,文件名自定义,后缀为.shvim first_shell.sh
# 脚本功能:输出系统基础信息,验证脚本运行# 输出欢迎信息(echo命令:打印内容到终端)echo "======================================"echo " 我的第一个Shell脚本 "echo "======================================"# 输出当前用户(使用系统变量$USER)echo "当前登录用户:$USER"# 输出当前工作目录(使用系统变量$PWD)echo "当前工作目录:$PWD"# 输出当前系统时间(使用date命令,格式化时间格式)echo "当前系统时间:$(date +%Y-%m-%d %H:%M:%S)"# 输出系统内核版本(使用uname命令)echo "内核:$(uname -r)"echo "======================================"echo " 脚本执行完成! "echo "======================================"
Linux中,新建的文件默认没有执行权限,必须先赋予执行权限,才能运行脚本。
# 赋予脚本执行权限(chmod +x 脚本名,最常用权限配置)chmod +x first_shell.sh# 运行脚本(必须用./脚本名,不能直接写脚本名)./first_shell.sh
终端会输出以下内容,说明脚本运行正常:
============================ 我的第一个Shell脚本 ============================当前登录用户:root当前工作目录:/root当前系统时间:2026-03-20 15:30:00内核:3.10.0-1160.81.1.el7.x86_64============================ 脚本执行完成! ============================
基础语法是编写脚本的“基石”,以下内容必须熟练掌握,每一个知识点都配了实例,方便理解和练习。
作用是告诉系统该用哪个解释器来执行这个脚本。
- 若不写这一行,系统会默认用系统自带的sh解释器执行,而sh和bash的语法有差异,会导致部分脚本报错,bash是Linux系统中最常用的Shell解释器,几乎所有Linux发行版都默认安装。
注释是脚本的“说明文档”,用于解释脚本功能、编写思路、关键步骤,注释内容不会被执行。Shell脚本支持两种注释方式:
规范建议:编写脚本时,尽量多写注释,尤其是复杂脚本,方便自己后续维护,也方便他人查看。
变量用于存储数据(如路径、数字、字符串),后续可以重复调用,避免重复编写相同内容,是脚本中最常用的语法之一。
# 变量定义格式:变量名=值(等号两边不能有空格)# 变量调用:在变量名前加$符号echo "姓名:$NAME"echo "年龄:$AGE"echo "我是$NAME,今年$AGE岁"
变量名只能包含字母、数字和下划线(不能以数字开头);
推荐变量名用大写(如NAME、AGE、DIR),区分大小写(name和NAME是两个不同变量);
避免使用系统内置变量名(如HOME、PWD、USER),防止覆盖系统变量。
Linux系统自带一些常用变量,可直接在脚本中调用,无需手动定义,高频使用的有:
echo $HOME # 输出当前用户的家目录(如/root)echo $PWD # 输出当前工作目录echo $USER # 输出当前登录用户echo $PATH # 输出环境变量(系统查找命令的路径)echo $? # 输出上一条命令的执行状态(0=成功,非0=失败,非常实用)echo $$ # 输出当前脚本的进程ID(PID)
补充:$? 是非常实用的系统变量,后续编写判断逻辑时经常用到,比如判断上一条命令是否执行成功。
Shell脚本中,字符串是最常用的数据类型
# 1. 字符串拼接(无需拼接符,直接连写)STR1="Hello"STR2="Shell"STR3=$STR1$STR2# 拼接结果:HelloShellecho$STR3# 2. 字符串长度(获取字符串的字符个数)echo ${#STR3}# 输出:9(HelloShell共9个字符)# 3. 字符串截取(从指定位置截取)# 格式:${变量名:起始位置:截取长度}(起始位置从0开始)echo ${STR3:0:5}# 从0位置开始,截取5个字符,输出:Helloecho ${STR3:5:4}# 从5位置开始,截取4个字符,输出:Shell
除了前面用到的 ./脚本名,Shell脚本还有另外两种运行方式,每种方式有不同的适用场景,新手需区分清楚。
chmod +x first_shell.sh # 先赋予执行权限(仅第一次需要)./first_shell.sh
适用场景:日常运行脚本、生产环境执行脚本;
注意:必须在脚本所在目录执行,若在其他目录,需写脚本的绝对路径(如/root/first_shell.sh)。
bash first_shell.sh # 无需chmod +x赋权,直接运行
优势:无需赋予执行权限,节省步骤,适合频繁修改脚本、测试脚本的场景;
注意:这种方式会强制用bash解释器执行,忽略脚本第一行的谢邦线(即使写了#!/bin/sh,也会用bash执行)。
source first_shell.sh# 或简写为. first_shell.sh
优势:执行脚本后,脚本中定义的变量、别名会在当前终端永久生效(其他两种方式不会);
注意:这种方式是“加载脚本”,不是“运行脚本”,脚本中的命令会在当前终端进程中执行,若脚本中有exit命令,会导致当前终端退出。
变量等号两边不能有空格:正确 NAME="张三",错误 NAME = "张三"(会报错“command not found”);
脚本第一行必须写 #!/bin/bash:否则系统可能用sh执行,导致语法不兼容(比如if条件判断报错);
运行脚本必须用 ./脚本名:直接写脚本名(如first_shell.sh),系统会在$PATH中查找,找不到会报错;
字符串有空格必须加引号:正确 TITLE="我的脚本",错误 TITLE=我的脚本(会把“我的”和“脚本”当作两个命令);
路径尽量用绝对路径:避免用相对路径(如./log),防止脚本在不同目录执行时,路径错误;
变量调用必须加 $:正确 echo $NAME,错误 echo NAME(会直接输出“NAME”,而不是变量的值);
注释不能写在命令行末尾(除非加空格):正确 echo "test" # 注释,错误 echo "test"#注释(#会被当作字符串的一部分);
脚本文件编码格式必须是UTF-8:若用Windows编辑脚本,会出现换行符错误(\r\n),导致脚本无法运行,需转换为Linux换行符(\n)。
可以编写一个脚本,输出自己的姓名、年龄,以及当前系统的日期、内核版本打在评论区练习一下