第六期:shell脚本编程

发布时间:2026/8/26 15:01:29
第六期:shell脚本编程 大家好接下来的一段时间我将开始学习野火的Linux系统课程并将学习到的干货逐步更新到我的CSDN博客中。没时间刷课的同学可以把我的博客喂给AI 突击一下。目录一、shell脚本简介1. Shell 脚本是什么2. Shell 脚本有什么用3. Shell 命令的本质4. Shell 脚本语言和 C 语言区别5. 常用 Shell 解释器6.第一个 Shell 脚本helloworld7.Shell 脚本三种启动方式二、shell脚本语法1. 变量定义三种写法1、不加双引号2、加上双引号 $* 与 $2.变量使用3. 字符串拼接4. 数学运算整数运算5. 条件检测逻辑与、||逻辑或6.条件判断语法test expression 等价 [ expression ]判断符号汇总7. 其他配套知识点① 命令结果赋值给变量② 删除变量③ 读取键盘输入 read④ 退出进程 exit⑤ 管道 |⑥ if 语句模板⑦case in 多分支匹配⑧ for in 循环⑨ while 循环⑩函数易错点总结一、shell脚本简介1. Shell 脚本是什么把 shell 命令按照一定语法编写而成的文本文件不需要编译由 shell 解释器执行。2. Shell 脚本有什么用批处理文件、整合多条命令实现自动化软件启动、服务启停系统性能监控日志分析处理运维自动化、批量任务都可以用 shell 脚本完成3. Shell 命令的本质分为内置命令和外部命令内置命令shell 解释器自带不需要调用外部程序如cd、echo外部命令独立可执行程序存放在系统目录如ls、cat4. Shell 脚本语言和 C 语言区别C 语言编译型语言需要先编译成二进制可执行文件再运行。Shell 脚本解释型语言不需要编译由解释器直接读取文本执行运行速度慢适合运维脚本。5. 常用 Shell 解释器查看系统可用解释器命令cat /etc/shells常见解释器/bin/bashLinux 默认最常用/bin/sh标准 shell/bin/zsh、/bin/csh6.第一个 Shell 脚本helloworld编辑新建文件hello.sh第一行写#!/bin/bashshebang 指定解释器#!/bin/bash echo hello world保存改权限赋予执行权限chmod x hello.sh运行7.Shell 脚本三种启动方式当程序执行直接运行chmod x hello.sh ./hello.sh新开子 shell 执行脚本内变量不会影响当前终端指定解释器运行bash hello.sh #简写因为系统环境变量 PATH 里面已经包含了 /bin 目录 # 或者写绝对路径 bin/bash hello.sh # 或者 sh hello.sh不需要执行权限新开子 shellsource 和.点命令source hello.sh # 等价 . hello.sh在当前 shell 进程执行脚本中定义的变量会保留在当前终端。三者区别./脚本、bash 脚本子 shell脚本结束变量销毁source/.当前 shell变量会留在终端二、shell脚本语法1. 变量定义三种写法nametom # 1. 单引号原样输出不解析变量 str1hello $name # -→ hello $name # 2. 双引号可以解析里面的变量 str2hello $name # -→ hello $name⚠️重要规则左右不能有空格单引号原样输出不会解析$变量双引号可以解析变量支持转义特殊变量变量作用$0脚本文件名$1 $2脚本传入第 1、2 个参数$#参数总个数$*全部参数 ( 被双引号包含时$* 和 $ 稍有不同)$全部参数 ( 被双引号包含时$* 和 $ 稍有不同)$?上条命令退出状态码$$脚本进程 PID1、不加双引号for i in $* do echo $i done for i in $ do echo $i done$*把所有参数拆分成多个单词循环逐个输出每个数字一行$同样把参数拆分成多个单词循环逐个输出每个数字一行 不加引号时$* 和 $ 行为完全一样2、加上双引号$*与$for i in $ do echo $i done for i in $* do echo $i done$保持每个参数独立仍然是多个独立元素循环依次输出每个参数占一行。$*把全部命令行参数合并成一个完整字符串当作1 个元素。 循环只执行 1 次所有参数输出在同一行1 2 3 4 5 6 72.变量使用# 当变量后面紧跟其他字符时必须加大括号普通情况两者等价 # nametom # echo $name # echo ${name} a123 echo $aabc # 会识别变量aabc为空输出空 echo ${a}abc # 识别变量a拼接abc -→输出123abc3. 字符串拼接shell 字符串拼接直接写在一起不需要加号ahello bworld res${a}${b} # 方式1花括号拼接 res2$a$b # 方式2直接并排写 echo $res # hello world示例课件代码var1$(pwd)aaa把pwd命令输出结果直接拼接字符串aaa4. 数学运算整数运算bash 本身不支持直接算术两种写法$(( ))算术扩展a10 b20 sum$((a b)) echo $sum支持 - * / %⚠️注意只能做整数运算不支持小数。5. 条件检测逻辑与、||逻辑或规则command1 command2逻辑与command1 执行成功返回 0才执行 command2失败则不执行后面command1 || command2逻辑或command1 执行失败非 0才执行 command2成功就不执行后面[ $a -eq $b ] || echo a!b #含义如果$a不等于$b就打印a!b [ -z $a ] || echo ${a} #含义如果$a不为空就打印变量 a 的值。6.条件判断语法test expression等价[ expression ]⚠️中括号左右两边必须有空格# 两种等价写法 test $a -gt 10 [ $a -gt 10 ]判断符号汇总符号含义-eq数值相等-ne数值不等-gt大于-lt小于-ge大于等于-le小于等于-z str字符串为空-n str字符串非空/字符串相等-d是否是目录-f是否是普通文件7. 其他配套知识点① 命令结果赋值给变量varcommand #反引号 var$(command) #推荐可读性更好② 删除变量unset var③ 读取键盘输入readread -p 提示文字: 变量名 #提示文字:与之前和之后的内容要用空格隔开⚠️提示文字:与之前和之后的内容要用空格隔开④ 退出进程exitexit 111 #退出脚本返回状态码111⑤ 管道|cmd1 | cmd2把前一个命令输出作为后一个命令输入。⑥ if 语句模板if condition1 then statement1 elif condition2 then statement2 …… else statementn fi以fi结束多分支判断条件满足对应条件执行对应语句。⑦case in 多分支匹配case expression in pattern1) statement1 ;; pattern2) statement2 ;; pattern3) statement3 ;; …… *) statementn ;; esac;;结束一个分支不能省略*)默认匹配相当于 else以esac结束示例匹配变量$a判断是否为 1、2其余走默认分支。⑧ for in 循环for variable in value_list do statements donevalue_list 支持 5 种形式直接给出具体的值给出一个取值范围使用命令执行结果使用 Shell 通配符使用特殊变量示例遍历/bin/*.sh所有 shell 文件打印文件名也可接收脚本传入参数循环遍历。⑨ while 循环while condition do statements done条件成立就循环执行 do 和 done 之间代码。⑩函数function name(){ statements [return value] }定义function 函数名(){}调用直接写函数名即可不需要括号示例定义my_name()内部 echo 输出字符串脚本中直接调用my_name执行。易错点总结[ ]括号内部必须空格赋值两边不能空格单引号不解析变量双引号解析变量变量拼接直接并排不要整数运算用$(( ))前成功才执行后||前失败才执行后