当前位置: 首页 > news >正文

Shell脚本编程基础:从零开始构建你的第一个脚本

一、Shell脚本的创建与执行
1.1 什么是Shell脚本
Shell脚本本质上是一个包含多个命令的文本文件。Shell会按顺序依次执行文件中的每一条命令,从而实现将多个命令串联起来完成复杂任务的目的。你可以把多个命令放在同一行,彼此间用分号(;)隔开,也可以分行书写。

bash
date ; who
date | who
1.2 创建Shell脚本文件
创建Shell脚本需要使用文本编辑器(如vim)来创建一个以.sh为后缀的文件。关键步骤是:必须在文件的第一行指定要使用的Shell解释器,格式为:

bash
#!/bin/bash
说明:#通常用作注释,而#!则是特殊标记,用来告诉系统用哪个Shell程序来运行该脚本。

创建示例:

bash
vim test.sh
在test.sh中输入以下内容:

bash
#!/bin/bash
echo “Hello, Shell!”
date
who

1.3 执行Shell脚本
创建好脚本后,有两种执行方式:

方法一:使用bash命令调用(不需要执行权限)

bash
bash test.sh
这种方式的本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。

方法二:使用路径直接执行(需要执行权限)

bash
/home/zhang/test.sh
./test.sh
新创建的脚本默认没有执行权限,直接运行会遇到Permission denied错误。需要先赋予可执行权限:

bash
chmod +x test.sh
然后就可以执行了:

bash
./test.sh
注意:使用./执行时,脚本必须具有可执行权限(x)。在生产环境中,不要轻易给文件赋予可执行权限。

echo命令——显示消息
echo命令用于将文本消息输出到控制台显示器,是Shell脚本中最常用的输出命令之一。

基本用法
bash
#!/bin/bash
echo “Hello World”
echo -n:不换行输出
使用-n选项可以取消输出内容后的换行符,将文本字符串和命令输出显示在同一行中:

bash
#!/bin/bash
echo -n “当前时间是:”
date
输出结果:

text
当前时间是:2026年 07月 09日 星期四 10:30:25 CST

三、Shell脚本中的变量
变量允许你在Shell脚本中临时存储信息,以便和脚本中的其他命令一起使用。

3.1 使用环境变量
在变量名称前加上美元符($)来引用环境变量:

bash
#!/bin/bash
echo “当前用户:USER"echo"当前路径:USER" echo "当前路径:USER"echo"当前路径:PWD”
echo "主目录:HOME"关于HOME" 关于HOME"关于的转义:当需要在引号中原样输出美元符加变量名称(而不是变量值)时,可以在美元符前放置反斜线(\)进行转义:

bash
#!/bin/bash
echo “我的家目录是:$HOME” # 输出:我的家目录是:HOMEecho"我的家目录是:HOME echo "我的家目录是:HOMEecho"我的家目录是:HOME" # 输出:我的家目录是:/home/username

3.2 自定义变量
Shell脚本允许用户自己定义并使用变量。用户定义的变量规则如下:

可以由字母、数字或下划线组成

长度不超过20个字符

区分大小写

使用等号(=)赋值,变量、等号和值之间不能出现空格

bash
#!/bin/bash
name=“张三”
age=20
score=95.5
echo “姓名:name"echo"年龄:name" echo "年龄:name"echo"年龄:age”
echo “成绩:$score”
重要:当你退出脚本后,在Shell命令行中无法直接调用脚本内定义的变量——这些是局部变量,只在脚本运行期间有效。

3.3 命令替换——将命令输出赋给变量
Shell脚本中最有用的特性之一是可以从一个命令的输出中提取信息,并将其赋给变量。有两种方法可以实现:

方法一:反引号(`)

bash
current_date=date
echo "当前日期:currentdate"方法二:current_date" 方法二:currentdate"方法二:() 格式(推荐)

bash
current_date=(date)echo"当前日期:(date) echo "当前日期:(date)echo"当前日期:current_date"
推荐使用$():它更易读,且支持嵌套使用。反引号是旧语法,可读性较差,容易与单引号混淆。

实际应用示例——生成唯一文件名:

bash
#!/bin/bash
date_suffix=KaTeX parse error: Expected group after '_' at position 32: …ilename="backup_̲{date_suffix}.log"
echo “生成的文件名:$filename”
+%Y%m%d格式告诉date命令将日期显示为两位数的年月日组合(例如:20260709)。

四、wc命令——统计文件内容
wc(word count)命令用于统计文件中的文本数据。默认情况下,它会输出三个值:

文本的行数

文本的词数

文本的字节数

基本用法
bash
wc test.txt
wc -l test.txt
wc -l *.sh
在脚本中使用
bash
#!/bin/bash
line_count=$(wc -l < “$0”)
echo “本脚本共有 $line_count 行”

五、Shell脚本中的数学运算
Bash Shell本身只支持整数运算。如果需要浮点数运算,需要使用bc命令。

5.1 使用expr命令
expr命令可以进行算术运算并返回结果。

基本格式:

bash
expr 操作数1 操作符 操作数2
注意事项:

操作符与数字之间必须有空格

乘法运算符(*)需要加反斜杠转义

bash
#!/bin/bash
result1=expr 5 + 3
result2=expr 10 - 4
result3=expr 5 \* 3
result4=expr 20 / 4
result5=expr 10 % 3

echo “5+3=result1"echo"10−4=result1" echo "10-4=result1"echo"104=result2”
echo “5*3=result3"echo"20/4=result3" echo "20/4=result3"echo"20/4=result4”
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/bash
result=[5+3]result2=[5 + 3] result2=[5+3]result2=[10 - 4]
result3=[5∗3]result4=[5 * 3] result4=[53]result4=[20 / 4]

echo “5+3=result"echo"10−4=result" echo "10-4=result"echo"104=result2”
echo “5*3=result3"echo"20/4=result3" echo "20/4=result3"echo"20/4=result4”
使用变量进行运算:

bash
#!/bin/bash
num1=10
num2=20
sum=[[[num1 +num2]echo"sum=num2] echo "sum=num2]echo"sum=sum"
$(( )) 格式:

bash
#!/bin/bash
result=$((5 + 3))
echoresultresult=result result=resultresult=(( (1 + 2) * 3 ))
echoKaTeX parse error: Expected 'EOF', got '#' at position 10: result #̲ 输出:9 注意:[]和$(())都不需要转义符,也不需要注意空格问题。但两者都只支持整数运算。

5.3 使用bc进行浮点数运算
当需要进行浮点数(小数)计算时,就需要使用bc命令。

在命令行中使用bc:

bash
bc
3.14 * 2
scale=4
10 / 3
quit
在脚本中使用bc:

基本格式:

bash
variable=$(echo “options; expression” | bc)
其中:

options:设置变量值格式(如scale=2表示保留2位小数)

多个选项用分号(;)分开

expression:要执行的数学表达式

示例:

bash
#!/bin/bash
result=(echo"scale=2;10/3"∣bc)echo"10/3=(echo "scale=2; 10 / 3" | bc) echo "10/3=(echo"scale=2;10/3"∣bc)echo"10/3=result"
result2=(echo"scale=4;22/7"∣bc)echo"22/7=(echo "scale=4; 22 / 7" | bc) echo "22/7=(echo"scale=4;22/7"∣bc)echo"22/7=result2
num1=3.14
num2=2.5
result3=(echo"(echo "(echo"num1 *num2"∣bc)echo"num2" | bc) echo "num2"∣bc)echo"num1 * $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提供了特殊变量?来保存上一个执行命令的退出状态码:

bash
ls /home
echo $? # 输出:0
ls /nonexistent
echo $? # 输出:非0值(如2)
6.3 在脚本中使用exit指定退出码
exit命令允许在脚本结束时指定一个退出状态码:

bash
#!/bin/bash
echo “脚本开始执行”
if [ -f “/etc/passwd” ]; then
echo “passwd文件存在”
exit 0 # 正常退出
else
echo “passwd文件不存在”
exit 1 # 异常退出
fi
示例:指定退出状态码为5

bash
#!/bin/bash
echo “执行完毕,退出码设为5”
exit 5
执行后,可以用echo $?查看退出状态码:

bash
bash test.sh
echo $? # 输出:5
注意:脚本的默认退出状态码是脚本中最后一个命令的退出状态码。建议使用exit命令明确指定退出状态码,以便其他程序判断脚本的执行结果。

七、综合练习题
根据课件要求,在Shell脚本中执行以下数学运算:

100 × (50 - 45)

100 ÷ 52

参考实现
使用$[]实现:

bash
#!/bin/bash
result1=$[100 * (50 - 45)]
echo "100 * (50 - 45) =result1"result2=result1" result2=result1"result2=[100 / 52]
echo "100 / 52 =result2"使用result2" 使用result2"使用(())实现:

bash
#!/bin/bash
result1=$((100 * (50 - 45)))
echo “100 * (50 - 45) = $result1”

result2=$((100 / 52))
echo “100 / 52 = $result2”
使用bc实现浮点数结果:

bash
#!/bin/bash
result1=$((100 * (50 - 45)))
echo “100 * (50 - 45) = $result1”

result2=$(echo “scale=4; 100 / 52” | bc)
echo “100 / 52 = $result2”
预期输出:

text
100 * (50 - 45) = 500
100 / 52 = 1 (整数除法,只保留整数部分)
使用bc时:

text
100 * (50 - 45) = 500
100 / 52 = 1.9230 (保留4位小数)
八、完整综合脚本示例
以下是一个综合了本文所有知识点的完整脚本:

bash
#!/bin/bash

1. echo命令 - 显示消息

echo “========== Shell脚本基础演示 ==========”
echo -n “脚本执行时间:”
date

2. 变量使用

echo -e “\n---------- 变量使用 ----------”
name=“Shell脚本学习者”
echo “欢迎,name!"echo"当前用户:name!" echo "当前用户:name"echo"当前用户:USER”
echo “当前目录:$PWD”

3. 命令替换

echo -e “\n---------- 命令替换 ----------”
current_date=KaTeX parse error: Expected group after '_' at position 29: …) filename="log_̲{current_date}.txt"
echo “生成的文件名:$filename”

4. wc命令 - 统计行数

echo -e “\n---------- 统计行数 ----------”
line_count=$(wc -l < “$0”)
echo “本脚本共有 $line_count 行”

5. 数学运算

echo -e “\n---------- 数学运算 ----------”

使用expr

sum=expr 10 + 20
echo “expr: 10 + 20 = $sum”

使用$[]

product=$[10 * 20]
echo “$[]: 10 * 20 = $product”

使用$(())

div=$((100 / 3))
echo “$(()): 100 / 3 = $div”

使用bc(浮点数)

float_result=$(echo “scale=2; 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 用scale=n控制小数位数
退出状态码 $?、exit n 0=成功,非0=失败

http://www.jsqmd.com/news/1162866/

相关文章:

  • YOLO11目标检测模型对各种图像格式(如JPEG、PNG、RGB、BMP、TIFF等)的支持、处理机制、应用场景、图像通道数详解、非标准格式转换方法、图像预处理最佳实践以及常见问题解决方案
  • Qbot实战:三步构建本地AI自动量化交易系统的深度指南
  • 3步搞定国家中小学智慧教育平台电子课本下载:免费工具终极指南
  • ScanTailor Advanced:3步解决扫描文档处理难题,让工作效率提升500%
  • 工业负载控制方案:TPD2015FN与MK64FN1M0VDC12应用解析
  • 2026天津黄金回收16区全详细位置 - 奢侈品回收评测
  • OpenCore Simplify:让黑苹果配置从复杂到简单的智能革命
  • 过时 LV 包包没人要?上海回收照样能变现回血 - 讯息早知道
  • ADP5350与PIC18F4525的智能电源管理方案
  • Windows Cleaner终极指南:告别C盘爆红的5个简单步骤
  • BQ25887与STM32F746ZG实现锂电池主动均衡方案
  • 2026年7月最新太原美度官方售后客服服务电话及地址网点大全 - 亨得利钟表维修中心
  • Deep-Live-Cam模型加载失败的3种情况与完美解决方案
  • 微信小程序/安卓app毕业设计优质选题汇总|2026‑2027届100个热门项目方向参考
  • 3分钟破解微信聊天记录加密:本地解密终极方案
  • Deep-Live-Cam模型加载失败?5步排查解决inswapper_128_fp16.onnx问题
  • 2026靠谱文武学校推荐!安徽TOP10榜单,少林小龙榜首实至名归 - 全国文武学校招生
  • 微信聊天记录本地解密终极指南:5步掌握高级数据恢复技术
  • 依托中医辨证膳食体系,以标准化饮食指导科学管控糖尿病血糖
  • 如何快速掌握无人机集群仿真:EGO-Planner-v2完整入门指南
  • 2026 年通海靠谱的回转小火锅设备生产商哪个好,别被高颜值骗了拆机才知塑料感满屏 - 行业推荐官【认证】
  • 数字记忆的守护者:WeChatMsg如何重塑个人数据主权
  • 2026年7月最新苏州江诗丹顿官方售后服务热线与网点地址查询 - 江诗丹顿服务中心
  • Unity游戏画面马赛克移除:后处理算法原理与实战调试指南
  • 支持源码私有化,垂直B2B定制厂商推荐
  • 空气质量在线监测管理平台解决方案
  • Windows任务栏透明化深度实现:TranslucentTB源码构建与配置实战
  • 终极指南:3分钟快速掌握Balena Etcher,免费创建启动盘的完整教程
  • 3分钟学会!国家中小学智慧教育平台电子课本一键下载终极指南
  • 网盘直链下载助手:5分钟掌握终极跨平台下载解决方案