
一、Shell脚本的创建与执行1.1 什么是Shell脚本Shell脚本本质上是一个包含多个命令的文本文件。Shell会按顺序依次执行文件中的每一条命令从而实现将多个命令串联起来完成复杂任务的目的。你可以把多个命令放在同一行彼此间用分号;隔开也可以分行书写。bashdate ; whodate | who1.2 创建Shell脚本文件创建Shell脚本需要使用文本编辑器如vim来创建一个以.sh为后缀的文件。关键步骤是必须在文件的第一行指定要使用的Shell解释器格式为bash#!/bin/bash说明#通常用作注释而#!则是特殊标记用来告诉系统用哪个Shell程序来运行该脚本。创建示例bashvim test.sh在test.sh中输入以下内容bash#!/bin/bashecho “Hello, Shell!”datewho1.3 执行Shell脚本创建好脚本后有两种执行方式方法一使用bash命令调用不需要执行权限bashbash test.sh这种方式的本质是bash解析器帮你执行脚本所以脚本本身不需要执行权限。方法二使用路径直接执行需要执行权限bash/home/zhang/test.sh./test.sh新创建的脚本默认没有执行权限直接运行会遇到Permission denied错误。需要先赋予可执行权限bashchmod x test.sh然后就可以执行了bash./test.sh注意使用./执行时脚本必须具有可执行权限x。在生产环境中不要轻易给文件赋予可执行权限。echo命令——显示消息echo命令用于将文本消息输出到控制台显示器是Shell脚本中最常用的输出命令之一。基本用法bash#!/bin/bashecho “Hello World”echo -n不换行输出使用-n选项可以取消输出内容后的换行符将文本字符串和命令输出显示在同一行中bash#!/bin/bashecho -n “当前时间是”date输出结果text当前时间是2026年 07月 09日 星期四 10:30:25 CST三、Shell脚本中的变量变量允许你在Shell脚本中临时存储信息以便和脚本中的其他命令一起使用。3.1 使用环境变量在变量名称前加上美元符$来引用环境变量bash#!/bin/bashecho “当前用户USERecho当前路径USER echo 当前路径USERecho当前路径PWD”echo 主目录HOME关于HOME 关于HOME关于的转义当需要在引号中原样输出美元符加变量名称而不是变量值时可以在美元符前放置反斜线\进行转义bash#!/bin/bashecho “我的家目录是$HOME” # 输出我的家目录是HOMEecho我的家目录是HOME echo 我的家目录是HOMEecho我的家目录是HOME # 输出我的家目录是/home/username3.2 自定义变量Shell脚本允许用户自己定义并使用变量。用户定义的变量规则如下可以由字母、数字或下划线组成长度不超过20个字符区分大小写使用等号赋值变量、等号和值之间不能出现空格bash#!/bin/bashname“张三”age20score95.5echo “姓名nameecho年龄name echo 年龄nameecho年龄age”echo “成绩$score”重要当你退出脚本后在Shell命令行中无法直接调用脚本内定义的变量——这些是局部变量只在脚本运行期间有效。3.3 命令替换——将命令输出赋给变量Shell脚本中最有用的特性之一是可以从一个命令的输出中提取信息并将其赋给变量。有两种方法可以实现方法一反引号bashcurrent_datedateecho 当前日期currentdate方法二current_date 方法二currentdate方法二() 格式推荐bashcurrent_date(date)echo当前日期(date) echo 当前日期(date)echo当前日期current_date推荐使用$()它更易读且支持嵌套使用。反引号是旧语法可读性较差容易与单引号混淆。实际应用示例——生成唯一文件名bash#!/bin/bashdate_suffixKaTeX parse error: Expected group after _ at position 32: …ilenamebackup_̲{date_suffix}.logecho “生成的文件名$filename”%Y%m%d格式告诉date命令将日期显示为两位数的年月日组合例如20260709。四、wc命令——统计文件内容wcword count命令用于统计文件中的文本数据。默认情况下它会输出三个值文本的行数文本的词数文本的字节数基本用法bashwc test.txtwc -l test.txtwc -l *.sh在脚本中使用bash#!/bin/bashline_count$(wc -l “$0”)echo “本脚本共有 $line_count 行”五、Shell脚本中的数学运算Bash Shell本身只支持整数运算。如果需要浮点数运算需要使用bc命令。5.1 使用expr命令expr命令可以进行算术运算并返回结果。基本格式bashexpr 操作数1 操作符 操作数2注意事项操作符与数字之间必须有空格乘法运算符*需要加反斜杠转义bash#!/bin/bashresult1expr 5 3result2expr 10 - 4result3expr 5 \* 3result4expr 20 / 4result5expr 10 % 3echo “53result1echo10−4result1 echo 10-4result1echo10−4result2”echo “5*3result3echo20/4result3 echo 20/4result3echo20/4result4”echo “10%3$result5”expr支持的操作符操作符 说明OP1 OP2 加法OP1 - OP2 减法OP1 * OP2 乘法需转义OP1 / OP2 除法OP1 % OP2 取余OP1 OP2 大于需转义OP1 OP2 小于需转义OP1 OP2 等于5.2 使用方括号[]或双括号[]或双括号(( ))$[ ] 格式bash#!/bin/bashresult[53]result2[5 3] result2[53]result2[10 - 4]result3[5∗3]result4[5 * 3] result4[5∗3]result4[20 / 4]echo “53resultecho10−4result echo 10-4resultecho10−4result2”echo “5*3result3echo20/4result3 echo 20/4result3echo20/4result4”使用变量进行运算bash#!/bin/bashnum110num220sum[[[num1 num2]echosumnum2] echo sumnum2]echosumsum$(( )) 格式bash#!/bin/bashresult$((5 3))echoresultresultresult resultresultresult(( (1 2) * 3 ))echoKaTeX parse error: Expected EOF, got # at position 10: result #̲ 输出9 注意[]和$(())都不需要转义符也不需要注意空格问题。但两者都只支持整数运算。5.3 使用bc进行浮点数运算当需要进行浮点数小数计算时就需要使用bc命令。在命令行中使用bcbashbc3.14 * 2scale410 / 3quit在脚本中使用bc基本格式bashvariable$(echo “options; expression” | bc)其中options设置变量值格式如scale2表示保留2位小数多个选项用分号;分开expression要执行的数学表达式示例bash#!/bin/bashresult(echoscale2;10/3∣bc)echo10/3(echo scale2; 10 / 3 | bc) echo 10/3(echoscale2;10/3∣bc)echo10/3resultresult2(echoscale4;22/7∣bc)echo22/7(echo scale4; 22 / 7 | bc) echo 22/7(echoscale4;22/7∣bc)echo22/7result2num13.14num22.5result3(echo(echo (echonum1 *num2∣bc)echonum2 | bc) echo num2∣bc)echonum1 * $num2 $result3注意bc中的scale变量用于指定小数点后的位数。如果系统没有安装bc需要先安装yum -y install bc。六、退出状态码Shell中运行的每个命令在结束时都会产生一个退出状态码exit status用于告诉Shell命令的执行结果。6.1 什么是退出状态码退出状态码是一个0~255的整数值0 表示命令执行成功1~255 表示命令执行失败或出现错误6.2 使用?查看退出状态码Linux提供了特殊变量?查看退出状态码 Linux提供了特殊变量?查看退出状态码Linux提供了特殊变量?来保存上一个执行命令的退出状态码bashls /homeecho $? # 输出0ls /nonexistentecho $? # 输出非0值如26.3 在脚本中使用exit指定退出码exit命令允许在脚本结束时指定一个退出状态码bash#!/bin/bashecho “脚本开始执行”if [ -f “/etc/passwd” ]; thenecho “passwd文件存在”exit 0 # 正常退出elseecho “passwd文件不存在”exit 1 # 异常退出fi示例指定退出状态码为5bash#!/bin/bashecho “执行完毕退出码设为5”exit 5执行后可以用echo $?查看退出状态码bashbash test.shecho $? # 输出5注意脚本的默认退出状态码是脚本中最后一个命令的退出状态码。建议使用exit命令明确指定退出状态码以便其他程序判断脚本的执行结果。七、综合练习题根据课件要求在Shell脚本中执行以下数学运算100 × (50 - 45)100 ÷ 52参考实现使用$[]实现bash#!/bin/bashresult1$[100 * (50 - 45)]echo 100 * (50 - 45) result1result2result1 result2result1result2[100 / 52]echo 100 / 52 result2使用result2 使用result2使用(())实现bash#!/bin/bashresult1$((100 * (50 - 45)))echo “100 * (50 - 45) $result1”result2$((100 / 52))echo “100 / 52 $result2”使用bc实现浮点数结果bash#!/bin/bashresult1$((100 * (50 - 45)))echo “100 * (50 - 45) $result1”result2$(echo “scale4; 100 / 52” | bc)echo “100 / 52 $result2”预期输出text100 * (50 - 45) 500100 / 52 1 整数除法只保留整数部分使用bc时text100 * (50 - 45) 500100 / 52 1.9230 保留4位小数八、完整综合脚本示例以下是一个综合了本文所有知识点的完整脚本bash#!/bin/bash1. echo命令 - 显示消息echo “ Shell脚本基础演示 ”echo -n “脚本执行时间”date2. 变量使用echo -e “\n---------- 变量使用 ----------”name“Shell脚本学习者”echo “欢迎nameecho当前用户name echo 当前用户nameecho当前用户USER”echo “当前目录$PWD”3. 命令替换echo -e “\n---------- 命令替换 ----------”current_dateKaTeX parse error: Expected group after _ at position 29: …) filenamelog_̲{current_date}.txtecho “生成的文件名$filename”4. wc命令 - 统计行数echo -e “\n---------- 统计行数 ----------”line_count$(wc -l “$0”)echo “本脚本共有 $line_count 行”5. 数学运算echo -e “\n---------- 数学运算 ----------”使用exprsumexpr 10 20echo “expr: 10 20 $sum”使用$[]product$[10 * 20]echo “$[]: 10 * 20 $product”使用$(())div$((100 / 3))echo “$(()): 100 / 3 $div”使用bc浮点数float_result$(echo “scale2; 100 / 3” | bc)echo “bc: 100 / 3 $float_result”6. 退出状态码echo -e “\n---------- 退出状态码 ----------”echo “脚本执行完毕”exit 0九、知识点总结知识点 关键命令/语法 说明脚本创建 vim test.sh 第一行必须写#!/bin/bash脚本执行 bash test.sh 或 ./test.sh 后者需要chmod x权限显示消息 echo / echo -n -n取消换行引用变量变量名如变量名 如变量名如USER、$HOME定义变量 变量名值 等号两边不能有空格命令替换命令或(命令)推荐使用(命令) 推荐使用(命令)推荐使用()统计行数 wc -l 文件名 可配合命令替换使用整数运算 expr、[]、[]、[]、(()) 注意expr需要空格和转义浮点运算 echo “表达式” | bc 用scalen控制小数位数退出状态码 $?、exit n 0成功非0失败