shell脚本编程语言
前言:Shell 脚本是什么普通人也能看懂的自动化小助手提到 Shell 脚本很多人第一反应是这不是程序员才学的东西吗其实不然。Shell 脚本虽然听起来有点“硬核”但它本质上做的事情非常朴素把原本需要你一遍一遍手动完成的操作交给电脑自动执行。如果你平时有过这些经历-每天重复打开很多文件-批量改文件名很麻烦-想自动备份重要资料-总是要重复执行同一串命令那么 Shell 脚本就很值得了解。它不像写大型程序那样复杂更像是你写给电脑的一份“自动工作清单”。这篇文章就带你用最容易理解的方式认识 Shell 脚本到底是什么、能做什么、怎么入门以及为什么它很适合用来解决重复性工作。一、Shell 脚本到底是什么先说结论Shell 脚本就是把一串命令写进一个文本文件里让系统按顺序执行。比如你平时在终端里输入ls #它只是帮你查看当前目录下的文件。如果你要做的事情不止一步而是1. 查看文件2. 复制文件3. 移动文件4. 输出提示信息那你就可以把这些命令写进一个脚本里让电脑一次性帮你完成。所以Shell 脚本可以理解成-手动敲命令你自己一步一步做-脚本执行命令你提前写好流程电脑自动做这也是它最有价值的地方节省时间减少重复劳动降低出错概率。你可能会觉得Shell 脚本是 Linux 运维或者开发人员才需要的技能。但实际上它的使用场景非常广甚至很多普通学习者也会遇到。1. 对学生来说适合做自动化练习比如你在学习 Linux、计算机基础或者服务器相关课程时经常会接触到命令行。Shell 脚本可以帮助你把零散的命令串起来形成完整流程。2. 对办公人群来说适合处理重复任务比如批量移动文件、整理资料、自动备份文档、定时清理临时文件等。这些事手动做很费时间但脚本可以一键完成。3. 对开发人员来说适合自动部署和测试比如项目构建、日志查看、环境初始化、运行测试等都可以借助脚本简化。4. 对运维人员来说几乎每天都能用到服务器检测、日志分析、服务重启、数据备份这些都很适合用 Shell 脚本来处理。简单来说Shell 脚本的价值就在于凡是重复、机械、流程固定的工作都可以考虑交给它。二、一个最简单的 Shell 脚本长什么样先看最基础的例子#!/bin/bash echo Hello, Shell!这段代码的意思非常简单#!/bin/bash #告诉系统用 Bash 来执行这个文件 echo #输出内容 Hello, Shell! #要显示的文字运行后屏幕上会显示Hello, Shell!虽然它很简单但已经体现了脚本的基本思想 把要执行的事情写进文件里让电脑自动跑。三、Shell 脚本里最常见的几个知识点下面这几个内容是入门 Shell 脚本时一定会遇到的基础知识。1. 变量给数据起个名字变量的作用就像一个“盒子”里面可以装数据。比如nameAlice echo Hello, $name输出结果是Hello, Alice这里的 name 就是变量。以后如果你想换成别的名字只要修改变量值就行不用把每一处都改一遍。变量有什么用它的意义在于提高复用性。比如文件路径、用户名、日期、目录名这些经常会变化的内容都可以放进变量里。2. 条件判断Shell 脚本也可以做判断。比如if [ 1 -eq 1 ] then echo 成立 else echo 不成立 fi这段代码的意思是- 如果条件成立就执行 then 后面的内容- 否则执行 else 后面的内容你可以把它理解成日常生活中的判断逻辑- 如果下雨就带伞- 否则就正常出门条件判断能做什么比如- 判断文件是否存在- 判断文件大小是否超出范围- 判断某个服务有没有启动- 判断输入内容是否正确3. 循环有些操作不是做一次就够了而是要重复很多次。这时候就需要循环。比如:for i in 1 2 3 4 5 do echo $i done输出会依次打印 1 到 5。循环适合什么场景- 批量处理多个文件- 对一组数据重复执行同样的操作- 自动化测试中重复运行任务如果没有循环很多重复任务就只能手动点很多次非常麻烦。4. 文件操作Shell 脚本最常用的部分Shell 脚本最常见的应用之一就是处理文件和目录。常见命令有- ls查看文件- cp复制文件- mv移动文件- rm删除文件- mkdir创建目录- cat查看文件内容比如mkdir backup cp file.txt backup/意思是1. 创建一个叫 backup 的文件夹2. 把 file.txt 复制进去这类操作非常适合写成脚本因为它们很固定也很容易重复。四、Shell 脚本能解决哪些实际问题理解一个技术最好的方式不是死记语法而是看它能帮我们解决什么问题。场景 1自动备份你每天都要备份一个文档手动操作容易忘。脚本可以帮你固定时间自动执行备份。场景 2批量整理文件比如很多图片、资料文件命名混乱你可以写脚本统一改名、分类、移动。场景 3清理垃圾文件像临时文件、缓存、旧日志脚本可以定时帮你清理。场景 4检查系统状态你可以通过脚本查看磁盘空间、内存情况、服务运行状态。场景 5简化重复命令比如安装环境、启动项目、查看日志这些一长串命令都可以封装进脚本里。所以Shell 脚本不是“为了写而写”而是为了让电脑替你做事。五、shell编程语言1、Shell基础1.1 Shell是什么Shell 是一个命令解释器它接收用户输入的命令并将其传递给操作系统内核执行。同时Shell 也是一种脚本语言可以将多条命令写入一个文件中批量执行无需编译。# 查看当前系统支持哪些 Shell cat /etc/shells # 查看当前用户默认使用的 Shell echo $SHELL1.2 脚本书写规范:文件名建议以.sh结尾第一行声明解释器#!/bin/bash注释以#开头使用echo或printf输出#!/bin/bash # 这是一个输出 Hello World 的示例脚本 echo Hello World1.3 脚本执行方式:方式说明bash script.sh启动子shell执行source script.sh当前shell中执行./script.sh需要执行权限chmod x script.sh # 添加执行权限 ./script.sh # 执行脚本1.4 退出状态码:每条命令执行后都会返回一个退出状态码0~2550成功非0失败使用exit n自定义状态码echo $? # 查看上一条命令的退出码2、变量2.1 变量定义与使用:变量名只能包含字母、数字和下划线且不能以数字开头。赋值时等号两边不能有空格nameJohn # 定义变量 echo $name # 使用变量推荐 ${name} unset name # 取消变量2.2 位置参数变量:位置参数用于获取脚本执行时传入的参数变量说明$0脚本本身的名称$1~$9第1到第9个参数${10}第10个及以上参数需用大括号$*所有参数作为一个整体字符串$所有参数每个参数独立$#参数的个数$$当前 Shell 进程的 PID$?上一条命令的退出状态码echo 第一个参数: $1 echo 参数个数: $#2.3 变量运算:Shell 支持整数运算可以使用$(( ))或let等a10 b3 echo $((a b)) # 加法 echo $((a * b)) # 乘法2.4 字符串处理:strhello world echo ${#str} # 长度 echo ${str:0:5} # 截取 echo ${str/world/script} # 替换3、条件测试3.1 测试语法:Shell 提供了四种条件测试语法test -f /etc/passwd [ -f /etc/passwd ] # 推荐注意空格 [[ -f /etc/passwd ]] # 增强版支持正则 (( 5 3 )) # 仅用于整数比较3.2 文件测试:操作符说明-e文件或目录是否存在-f是否存在且为普通文件-d是否存在且为目录-x是否存在且可执行3.3 字符串测试:[ -z $var ] # 判断字符串是否为空zero [ $a $b ] # 判断两个字符串是否相等3.4 整数比较:在[]中在(())中说明-eq等于-ne!不等于-gt大于-lt小于-ge大于等于-le小于等于4、流程控制4.1 if 语句:#!/bin/bash read -p 请输入分数0-100: score if (( score 0 || score 100 )); then echo 无效分数 elif (( score 85 )); then echo 优秀 (A) elif (( score 70 )); then echo 良好 (B) elif (( score 60 )); then echo 及格 (C) else echo 不及格 (D) fi4.2 case 语句:适用于多分支匹配比多个if-elif更清晰。case $grade in A) echo 优秀 ;; B) echo 良好 ;; *) echo 其他 ;; esac5、循环结构5.1 for 循环:带列表的 forfor i in {1..5}; do echo $i doneC 语言风格的 forfor ((i1; i5; i)); do echo $i done5.2 while 循环:当条件为真时执行循环i1 while [ $i -le 5 ]; do echo $i ((i)) done5.3 until 循环:与 while 相反条件为假时执行直到条件变为真i1 until [ $i -gt 5 ]; do echo $i ((i)) done5.4 select 循环:自动生成菜单用户输入数字选择select color in 红 绿 蓝; do echo 你选择了: $color break done6、函数与数组6.1 函数定义与调用:函数可以简化重复代码支持传递参数通过$1、$2等获取add() { echo $(( $1 $2 )) } result$(add 3 5)6.2 数组操作:Shell 支持普通数组索引从0开始和关联数组需declare -Aarr(a b c d) echo ${arr[0]} # 第一个元素 echo ${#arr[]} # 数组长度 arr(e) # 添加元素7、正则表达式正则表达式用于文本模式匹配常用元字符元字符说明^行首$行尾.任意单个字符*前一项出现0次或多次[]匹配括号内任意一个字符[^]不匹配括号内任意字符grep ^root /etc/passwd # 匹配以root开头的行8、文本处理三剑客8.1 grep:– 搜索文本grep -i error log.txt # 忽略大小写 grep -r config /etc/ # 递归搜索目录 grep -c fail log.txt # 统计匹配行数8.2 sed – 流编辑器非交互式修改文本sed s/old/new/g file # 全局替换 sed -i 3d file # 删除第3行并直接修改文件 sed -n 2,5p file # 打印第2到5行8.3 awk– 强大的文本分析工具awk {print $1} file # 打印第一列默认空格分隔 awk -F: {print $1} /etc/passwd # 以冒号为分隔符 # 统计 IP 访问次数 awk {count[$1]} END {for(ip in count) print ip, count[ip]} access.log9、常用内置(awk)函数函数示例说明length(s)length(hello)返回字符串长度 → 5split(s, arr, sep)split(a:b:c, arr, :)分割字符串到数组substr(s, start, len)substr(hello, 2, 3)截取 → elltoupper(s)toupper(abc)转大写 → ABCtolower(s)tolower(ABC)转小写 → abcgsub(old, new, s)gsub(/root/, admin, $1)全局替换length(hello) # 返回5 split(a:b:c, arr, :) # 分割字符串 substr(hello, 2, 3) # 返回 ell toupper(abc) # 返回 ABC六、学习 Shell 脚本时常见的几个误区很多初学者一开始学 Shell 时容易踩一些坑。下面这些问题值得注意。1. 直接复制别人的代码不理解含义网上很多脚本看起来很方便但如果你不知道每一行在做什么出错时很难排查。2. 忽略空格和符号Shell 脚本对格式比较敏感空格、引号、括号写错都可能导致运行失败。3. 乱用危险命令比如rm -rf这类命令一定要谨慎。执行前要确认路径避免误删重要文件。4. 忘记执行权限脚本文件不是写好就能运行的通常还需要加执行权限chmod x script.sh5. 一开始就追求“大而全”其实入门时不用学太多复杂内容。先掌握基础命令、变量、判断、循环就已经足够应付很多实际任务了。七、Shell 脚本的真正意义让电脑帮你工作很多人学技术时容易只盯着“语法”看觉得一堆命令很难记。但如果换个角度你会发现 Shell 脚本本质上就是一个很实用的工具。它的意义不是“看起来厉害”而是- 节省时间- 减少重复劳动- 降低人为失误- 提高工作效率- 让流程更标准化换句话说Shell 脚本不是让你多做事而是让电脑替你做重复的事。这就是它最吸引人的地方。八、总结Shell 脚本看起来像一串命令但它真正解决的是一个很现实的问题如何把重复、固定、容易出错的操作自动化。对于初学者来说不需要一开始就学得很深。先认识 Shell 的基本概念再掌握变量、条件判断、循环和常用文件操作就已经能够完成很多常见任务了。如果你把 Shell 脚本理解成一种“自动化小助手”你会发现它其实非常亲切也非常实用。它不会替代你的思考但可以帮你省下大量重复劳动让你把时间花在更重要的事情上。结尾:如果你正在学习 Linux、服务器、自动化或编程基础Shell 脚本是一个非常值得入门的方向。它不一定是最华丽的技术但它往往是最直接、最实用的工具之一。下一次当你又要重复执行一堆相同操作时不妨想一想这件事能不能写成一个脚本让电脑帮我做