前言
本次实训基于 Xshell 远程连接 VMware Ubuntu 虚拟机,收录本次所有截图对应的全部命令、完整脚本、运行输出、报错信息、原理解析,覆盖脚本创建、权限管理、脚本执行、echo 输出、变量使用、日志生成、整数 / 浮点运算、退出状态码全知识点,无内容遗漏,可直接作为 Linux 课程实训报告配套技术文章。
一、基础前置核心知识点
1. Shell 脚本基础规范
- 脚本后缀统一为
.sh,文件首行必须写释伴行#!/bin/bash,指定 bash 解释器; - 创建脚本工具:
vim 脚本名.sh; - 两种脚本执行模式:
- 模式 1:
bash 脚本名.sh,无需文件执行权限,直接调用 bash 解释器读取运行; - 模式 2:
./脚本名.sh,文件必须拥有x可执行权限,否则抛出Permission denied;
- 模式 1:
- 权限操作命令:
chmod u+x 脚本名.sh:给文件所有者添加执行权限;ls -l 脚本名.sh:查看文件权限,权限位x代表可执行标记;
- bash 执行语法参考:
bash --help,标准格式bash [参数] script-file ...。
2. echo 输出命令用法
echo "内容$变量":双引号自动解析$变量,输出变量真实值;echo -n "内容":-n参数取消输出末尾自动换行;echo "\$变量":反斜杠\转义$,原样输出$变量字符串,不解析变量。
3. Shell 变量分类与规则
(1)系统内置环境变量(无需定义,直接调用)
$USER:当前登录用户名$UID:用户数字 ID$HOME:用户家目录绝对路径
(2)自定义变量
赋值格式:变量名=值,等号两侧禁止空格;调用格式$变量名;多个变量连续书写自动拼接内容。
(3)转义符\
\$屏蔽变量解析,原样打印$符号。
二、实操案例 1:查看 bash 执行语法(bash --help 截图)
1. 执行命令
bash --help2. 截图关键输出
plaintext
GNU bash, version 5.2.21(1)-release-(x86_64-pc-linux-gnu) Usage: bash [GNU long option] [option] bash [GNU long option] [option] script-file ...3. 知识点解读
bash script-file是无权限运行脚本的标准语法,对应实操中bash test.sh执行方式。
三、实操案例 2:基础日期日志脚本 test.sh(创建、bash 无权限运行)
1. 创建脚本文件命令
vim test.sh2. test.sh 完整源码
#!/bin/bash #This script displays the date and who's logged on echo -n "The time and date are:" date echo "Let's see who's logged into the system:" who3. 无权限执行方式:bash test.sh
执行命令
bash test.sh运行输出结果
plaintext
The time and date are:Thu Jul 9 10:39:27 AM CST 2026 Let's see who's logged into the system: jiayang7 pts/0 2026-07-09 10:12 (192.168.237.1) jiayang7 seat0 2026-07-09 10:13 (login screen) jiayang7 tty2 2026-07-09 10:13 (tty2)4. 原理说明
直接调用 bash 程序读取脚本,不依赖文件自身执行权限,适合脚本调试。
四、实操案例 3:./test.sh 权限报错 + chmod 赋执行权限完整流程
步骤 1:直接./test.sh执行,权限不足报错
执行命令
./test.sh报错信息
plaintext
-bash: ./test.sh: Permission denied查看原始文件权限
ls -l test.sh输出:-rw-rw-r-- 1 jiayang7 jiayang7 72 Jul 9 10:38 test.sh权限位无x,缺少执行权限。
步骤 2:赋予所有者可执行权限
chmod u+x ./test.sh步骤 3:验证权限修改结果
ls -l test.sh输出:-rwxrw-r-- 1 jiayang7 jiayang7 72 Jul 9 10:38 test.sh权限位出现x标记,代表可执行权限生效。
步骤 4:权限生效后 ./test.sh 正常运行
执行命令
./test.sh运行输出
plaintext
The time and date are:Thu Jul 9 10:44:32 AM CST 2026 Let's see who's logged into the system: jiayang7 pts/0 2026-07-09 10:12 (192.168.237.1) jiayang7 seat0 2026-07-09 10:13 (login screen) jiayang7 tty2 2026-07-09 10:13 (tty2)五、实操案例 4:系统内置环境变量 \(USER/\)UID/$HOME 演示
1. 变量脚本源码
#!/bin/bash #This script displays variable echo "User info for userid: $USER" echo UID:$UID echo HOME:$HOME echo HOME:\$HOME2. 执行命令
./test.sh3. 输出结果
plaintext
User info for userid: jiayang7 UID:1000 HOME:/home/jiayang7 HOME:$HOME4. 核心知识点
$USER/$UID/$HOME系统自带环境变量,自动读取当前用户信息;$HOME直接解析输出家目录路径;\$HOME转义后原样打印$HOME字符串。
六、实操案例 5:自定义变量、变量拼接演示
1. 自定义变量脚本源码
#!/bin/bash #Users define variables name1="jiayang" name2="ywq" day1=1 day2=2 echo "$name1 checked in $day1 day ago" echo "$name2 checked in $day2 days ago" echo "$name1 checked in $day1$day2 days ago"2. 运行输出
plaintext
jiayang checked in 1 day ago ywq checked in 2 days ago jiayang checked in 12 days ago3. 知识点
自定义变量赋值变量=值,等号无空格;连续书写$day1$day2自动拼接为12。
4.获得当前日期并用它生成唯一文件名
七、实操案例 6:exit 自定义退出状态码
1. exit_test.sh 完整脚本
#!/bin/bash var=5 echo "The answer is $var" exit $var2. 执行命令
vim exit_test.sh bash exit_test.sh # 查看脚本退出状态码 echo $?3. 运行输出
plaintext
The answer is 5 # echo $? 输出:54. 原理
exit 数字自定义脚本退出码,执行echo $?读取上一条程序返回状态,用于流程判断。
八、实操案例 7:wc 文件行数统计工具
全部执行命令
# 完整统计:行数、单词数、字符数 wc test.sh # 仅统计文件行数 wc -l test.sh # 错误写法:参数与通配符无空格,报无效参数 wc -l* # 正确写法,空格分隔 wc -l *报错解析
wc: invalid option -- '*',-l*连写导致*被识别为命令参数,必须空格分隔wc -l *。
九、实操案例 8:四种 Shell 数学运算完整实操
9.1 expr 整数运算(运算符必须空格,* 需转义 *)
# 错误:无空格 expr 1+5 # 正确:运算符两侧空格 expr 1 + 5 # 错误:*未转义,识别为文件通配符 expr 5 * 2 # 正确:乘号转义 expr 5 \* 29.2 $[] / $(()) 整数复合运算脚本 operation_test.sh
#!/bin/bash #This script shows basic mathematical operations result1=$[100*(50-45)] echo "The result of the square bracket operation is : $result1" result2=$((100*(50-45))) echo "The result of double bracket operation is : $result2" result3=$[100/52] echo "The result of the second test is : $result3"执行 & 输出
bash operation_test.sh The result of the square bracket operation is : 500 The result of double bracket operation is : 500 The result of the second test is : 1说明
$[]与$(())功能完全一致,仅支持整数,除法自动向下取整。
9.3 bc 浮点小数运算(scale 控制保留小数位数)
交互式 bc 命令
bc # 默认整数除法 100/52 # 设置保留4位小数 scale=4 100/52 exit输出:
plaintext
1 scale=4 1.9230脚本管道调用 bc(bc_test.sh)
#!/bin/bash #This script shows bc operations var1=$(echo "scale=5; 3.44/5" | bc) echo "This answer is $var1" # 先运算后设置scale,不生效 var2=$(echo "3.44/5; scale=5" | bc) echo "This exchange answer is $var2" # 自定义变量代入浮点运算 num=77 var3=$(echo "scale=3;$num/$var1" | bc) echo "This answer is $var3"关键规则
scale=N必须写在除法运算前,小数位数才会生效。
十、全文实训综合总结(作业答题专用)
1. 创建 & 运行 sh 脚本完整流程
- 创建脚本:
vim xxx.sh,首行添加#!/bin/bash解释器声明; - 无权限调试运行:
bash xxx.sh; - 标准执行完整流程:① 赋予执行权限:
chmod u+x xxx.sh② 执行脚本:./xxx.sh③ 权限校验:ls -l xxx.sh,确认权限位存在x标记 - 权限报错
Permission denied解决:执行chmod u+x 脚本名.sh添加执行权限。
2. echo 输出三大用法
echo "文本$变量":解析变量输出真实值;echo -n "文本":输出不自动换行;echo "\$变量":反斜杠转义,原样打印$符号。
3. $ 变量使用规则
- 系统内置变量:
$USER、$UID、$HOME,直接调用; - 自定义变量:
变量名=值(等号两侧无空格),调用$变量名; - 多变量连续书写自动拼接内容;
\$屏蔽变量解析,打印原始$字符串。
4. 四种数学运算对比表
表格
| 运算方式 | 是否支持小数 | 使用限制 |
|---|---|---|
| expr | 仅整数 | 运算符前后必须空格,*需转义\* |
| $[] | 仅整数 | 无需转义,支持括号复合运算 |
| $(()) | 仅整数 | 语法、功能和 $[] 完全一致 |
| bc | 支持浮点小数 | scale=N控制小数位数,可管道嵌入脚本 |
5. exit 退出状态码
exit 自定义数字设置脚本返回值,执行echo $?读取上一条程序退出状态,用于程序逻辑判断。
6. wc 文件统计工具
wc -l 文件名统计文件行数;命令参数与通配符*之间必须添加空格,否则报参数错误。