一、使用多个命令:串联与管道
Shell脚本的核心能力之一是将多个命令组合执行。
1. 分号串联(顺序执行)
将多个命令放在同一行,用分号;隔开,Shell会按顺序依次执行:
bash
date ; who
效果:先显示当前日期时间,再显示当前登录用户列表。
2. 管道连接(传递结果)
使用管道符|可以将前一个命令的输出作为后一个命令的输入,最终只显示最后一个命令的输出:
bash
date | who
效果:date的输出被传给who,但who不接收标准输入,所以实际上等同于只执行who。更典型的管道示例:
bash
ls -l | grep ".sh"
二、创建与执行Shell脚本文件
1. 创建脚本文件
使用vim创建.sh后缀的文件,第一行必须指定解释器:
bash
#!/bin/bash
# 这是一个注释
echo "Hello, Shell!"
#! 告诉系统用哪个Shell程序来运行脚本
普通#用于注释
2. 执行脚本的两种方法
方法一:直接调用bash命令
bash
bash test.sh
方法二:赋予可执行权限后,用路径执行
bash
chmod +x test.sh
./test.sh # 相对路径
# 或 /home/zhang/zz/sh_script/test.sh 绝对路径
如果不加执行权限,会报错 Permission denied
三、echo命令与消息显示
echo用于向控制台输出文本消息,帮助用户了解脚本运行状态。
基础用法
bash
echo "正在执行脚本..."
-n 参数(不换行)
将文本和后续命令输出显示在同一行:
bash
#!/bin/bash
echo -n "当前用户是:"
who
输出:当前用户是:zhang pts/0 2026-07-10 10:30
四、变量使用
1. 引用环境变量
在变量名前加$即可引用:
bash
#!/bin/bash
echo "当前用户家目录:$HOME"
echo "当前路径:$PWD"
如果只想显示$符号本身,需要加反斜杠转义:
bash
echo "\$HOME 是环境变量"
2. 自定义变量
由字母、数字、下划线组成,长度≤20,区分大小写
赋值时=两边不能有空格
bash
#!/bin/bash
name="zhang"
age=20
echo "姓名:$name,年龄:$age"
脚本退出后,变量在命令行中不可见(局部变量)
3. 命令替换——将命令输出赋给变量
两种语法:
bash
# 反引号方式(旧)
current_date=`date +%y%m%d`
# $()方式(推荐,更清晰)
current_date=$(date +%y%m%d)
实战:生成唯一文件名
bash
#!/bin/bash
prefix="backup"
date_suffix=$(date +%y%m%d)
filename="${prefix}_${date_suffix}.log"
echo "生成的文件名:$filename"
五、wc命令——统计文件行数
wc(word count)默认输出三个值:行数、词数、字节数。
常用参数
| 参数 | 含义 |
| -l | 只显示行数 |
| -w | 只显示词数 |
| -c | 只显示字节数 |
示例
bash
# 查看单个脚本的行数
wc -l test.sh
# 查看所有.sh文件的总行数
wc -l *.sh
六、数学运算
Shell默认只支持整数运算,有四种方式。
1. expr命令
```bash
expr 100 + 50
expr 100 \* 2 # 乘号需要转义
```
注意:运算符与数字之间必须有空格
2. $[ ] 或 $(( )) (推荐)
bash
echo $[100 * (50 - 45)] # 输出 500
echo $((100 / 52)) # 输出 1(整数除法)
不需要转义符
空格可有可无
支持变量
bash
a=10
b=3
echo $[a * b] # 输出 30
3. bc计算器(支持浮点数)
bc是内建计算器,支持浮点运算。
命令行交互:
bash
bc
scale=4
10/3
quit
在脚本中使用bc:
bash
#!/bin/bash
result=$(echo "scale=4; 100 / 52" | bc)
echo "结果:$result"
注意:options和expression之间用分号;隔开,先写scale再写表达式
七、退出状态码
每个命令执行完毕后都会返回一个0~255的整数值,0表示成功,非0表示失败。
查看退出状态码
```bash
ls /home
echo $? # 显示上一条命令的退出码
```
在脚本中自定义退出码
```bash
#!/bin/bash
echo "执行完毕"
exit 5 # 手动指定退出码为5
```
执行后运行echo $?会显示5。
---
八、综合实战脚本
将以上知识点整合到一个脚本中:
```bash
#!/bin/bash
# 综合示例脚本
echo -n "开始执行时间:"
date
# 使用命令替换生成文件名
filename="report_$(date +%y%m%d).txt"
echo "本次报告将保存为:$filename"
# 自定义变量
user_name="zhang"
echo "操作者:$user_name"
# 数学运算(整数)
a=100
b=45
result=$[a * (50 - b)]
echo "100*(50-45) = $result"
# 浮点数运算(使用bc)
float_result=$(echo "scale=2; 100 / 52" | bc)
echo "100/52 = $float_result"
# 统计脚本自身行数
line_count=$(wc -l < $0)
echo "本脚本共有 $line_count 行"
echo "脚本执行完毕,正常退出"
exit 0
```
执行结果截图示意(请根据实际运行截图替换):
```
开始执行时间:2026年 07月 10日 星期五 10:30:00 CST
本次报告将保存为:report_260710.txt
操作者:zhang
100*(50-45) = 500
100/52 = 1.92
本脚本共有 18 行
脚本执行完毕,正常退出
```
九、知识框架总结
| 类别 | 命令/语法 | 用途 | 关键点 |
| 多命令 | ; | 顺序执行 | 命令间无关 |
| 管道 | \| | 传递输出 | 只显最终结果 |
| 脚本创建 | #!/bin/bash | 指定解释器 | 必须第一行 |
| 执行脚本 | bash/chmod +x | 运行脚本 | 路径或命令 |
| 输出消息 | echo | 显示文本 | -n不换行 |
| 引用变量 | $VAR | 取变量值 | 环境/自定义 |
| 命令替换 | $(...) | 命令输出附变量 | 推荐写法 |
| 行数统计 | wc -l | 统计行数 | 支持通配符 |
| 整数运算 | $[...]/$((...)) | 数学计算 | 不用转义 |
| 浮点运算 | bc | 浮点数计算 | 需scale |
| 退出状态 | $?/exit | 检查/设置退出码 | 0=成功 |