当前位置:首页>Linux>老王linux-进阶-shell编程(一)语法与运行规范

老王linux-进阶-shell编程(一)语法与运行规范

  • 2026-10-02 07:41:43
老王linux-进阶-shell编程(一)语法与运行规范

一、什么是Shell脚本

在Linux运维和开发工作中,我们经常会遇到重复执行的操作——比如每天备份日志、批量创建文件、检查服务状态、部署项目等。如果每次都手动敲命令,不仅耗时费力,还容易出错。

Shell脚本就是解决这个问题的:它是一系列Linux命令的有序集合,将重复的操作写成一个脚本文件,执行一次脚本,就能自动完成所有步骤,实现自动化办公。

Shell脚本的核心用途:

  • 自动化部署:一键部署项目、安装依赖,替代手动执行一系列部署命令;

  • 日志管理:定时备份日志、清理过期日志,避免日志占满磁盘;

  • 批量处理:批量创建/删除文件、批量修改文件名、批量执行命令;

  • 服务监控:定时检查服务运行状态,异常时自动重启或发送告警;

  • 系统维护:磁盘、内存监控,系统信息采集,自动化完成日常维护工作。

一句话总结:Shell脚本是Linux运维的“必备技能”,能自动化的绝不手动敲,学会它能极大提升工作效率,摆脱重复劳动。

二、写出第一个可运行的Shell脚本

1. 创建脚本文件

Shell脚本的后缀名通常为 .sh(虽然后缀不影响执行,但规范命名能方便识别),使用vim创建脚本:

# 进入家目录(方便管理脚本,也可自定义路径)cd ~# 创建脚本文件,文件名自定义,后缀为.shvim first_shell.sh

2. 编写脚本内容(固定结构+基础命令)

# 脚本功能:输出系统基础信息,验证脚本运行# 输出欢迎信息(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 "======================================"

3. 赋予执行权限+运行脚本

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============================   脚本执行完成!              ============================

三、Shell脚本最核心的基础语法

基础语法是编写脚本的“基石”,以下内容必须熟练掌握,每一个知识点都配了实例,方便理解和练习。

1. 脚本第一行:#!/bin/bash

作用是告诉系统该用哪个解释器来执行这个脚本。

- 若不写这一行,系统会默认用系统自带的sh解释器执行,而sh和bash的语法有差异,会导致部分脚本报错,bash是Linux系统中最常用的Shell解释器,几乎所有Linux发行版都默认安装。

2. 注释(脚本可读性必备)

注释是脚本的“说明文档”,用于解释脚本功能、编写思路、关键步骤,注释内容不会被执行。Shell脚本支持两种注释方式:

规范建议:编写脚本时,尽量多写注释,尤其是复杂脚本,方便自己后续维护,也方便他人查看。

3. 变量(Shell脚本的“容器”,存储数据)

变量用于存储数据(如路径、数字、字符串),后续可以重复调用,避免重复编写相同内容,是脚本中最常用的语法之一。

3.1 变量定义(核心规则)

# 变量定义格式:变量名=值(等号两边不能有空格)# 变量调用:在变量名前加$符号echo "姓名:$NAME"echo "年龄:$AGE"echo "我是$NAME,今年$AGE岁"

3.2 变量命名规则(规范)

  • 变量名只能包含字母、数字和下划线(不能以数字开头);

  • 推荐变量名用大写(如NAME、AGE、DIR),区分大小写(name和NAME是两个不同变量);

  • 避免使用系统内置变量名(如HOME、PWD、USER),防止覆盖系统变量。

3.3 常用系统变量(直接调用,无需定义)

Linux系统自带一些常用变量,可直接在脚本中调用,无需手动定义,高频使用的有:

echo $HOME     # 输出当前用户的家目录(如/root)echo $PWD      # 输出当前工作目录echo $USER     # 输出当前登录用户echo $PATH     # 输出环境变量(系统查找命令的路径)echo $?        # 输出上一条命令的执行状态(0=成功,非0=失败,非常实用)echo $$        # 输出当前脚本的进程ID(PID)

补充:$? 是非常实用的系统变量,后续编写判断逻辑时经常用到,比如判断上一条命令是否执行成功。

4. 字符串操作

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脚本的3种运行方式

除了前面用到的 ./脚本名,Shell脚本还有另外两种运行方式,每种方式有不同的适用场景,新手需区分清楚。

方式1:./脚本名

chmod +x first_shell.sh  # 先赋予执行权限(仅第一次需要)./first_shell.sh

适用场景:日常运行脚本、生产环境执行脚本;

注意:必须在脚本所在目录执行,若在其他目录,需写脚本的绝对路径(如/root/first_shell.sh)。

方式2:bash 脚本名

bash first_shell.sh  # 无需chmod +x赋权,直接运行

优势:无需赋予执行权限,节省步骤,适合频繁修改脚本、测试脚本的场景;

注意:这种方式会强制用bash解释器执行,忽略脚本第一行的谢邦线(即使写了#!/bin/sh,也会用bash执行)。

方式3:source 脚本名(或 . 脚本名,用于加载环境变量)

source first_shell.sh# 或简写为. first_shell.sh

优势:执行脚本后,脚本中定义的变量、别名会在当前终端永久生效(其他两种方式不会);

注意:这种方式是“加载脚本”,不是“运行脚本”,脚本中的命令会在当前终端进程中执行,若脚本中有exit命令,会导致当前终端退出。

五、必避记录:

  1. 变量等号两边不能有空格:正确 NAME="张三",错误 NAME = "张三"(会报错“command not found”);

  2. 脚本第一行必须写 #!/bin/bash:否则系统可能用sh执行,导致语法不兼容(比如if条件判断报错);

  3. 运行脚本必须用 ./脚本名:直接写脚本名(如first_shell.sh),系统会在$PATH中查找,找不到会报错;

  4. 字符串有空格必须加引号:正确 TITLE="我的脚本",错误 TITLE=我的脚本(会把“我的”和“脚本”当作两个命令);

  5. 路径尽量用绝对路径:避免用相对路径(如./log),防止脚本在不同目录执行时,路径错误;

  6. 变量调用必须加 $:正确 echo $NAME,错误 echo NAME(会直接输出“NAME”,而不是变量的值);

  7. 注释不能写在命令行末尾(除非加空格):正确 echo "test" # 注释,错误 echo "test"#注释(#会被当作字符串的一部分);

  8. 脚本文件编码格式必须是UTF-8:若用Windows编辑脚本,会出现换行符错误(\r\n),导致脚本无法运行,需转换为Linux换行符(\n)。

可以编写一个脚本,输出自己的姓名、年龄,以及当前系统的日期、内核版本打在评论区练习一下

最新文章

随机文章