8.2 基础Shell脚本

系列 - LINUX Shell脚本
目录
本实验手册涵盖了四个任务,包括编写交互式脚本、根据日期创建文件、进行数值运算和了解不同脚本运行方式。通过这些任务,学习者将掌握 read
命令、变量赋值、日期命令、算术运算和脚本执行的不同方法。
任务一:编写交互式脚本
实验目的
学习如何编写一个简单的交互式脚本,掌握
read
命令的基本用法。
交互式脚本
交互式脚本指的是在运行过程中需要用户参与的脚本。它会在特定位置暂停执行,等待用户输入信息,然后根据用户的输入内容继续后续操作。这种人机交互的方式让脚本更加灵活,能够根据不同用户的输入做出相应的响应。
1. 创建工作目录
首先,我们需要创建一个专门存放脚本的目录:
cd # 切换到家目录
mkdir scripts # 创建scripts目录
cd scripts # 进入scripts目录
2. 编写脚本
使用文本编辑器(如 vim)创建并编写脚本文件 fullname.sh
:
#!/bin/bash
# 脚本名: fullname.sh
# 功能:接收用户输入的姓名,并显示完整姓名
# 作者: Lu
# 提示用户输入姓氏
read -p "请输入姓氏:" firstname
# 提示用户输入名字
read -p "请输入名字:" lastname
# 显示完整姓名
echo -e "你的全名是: $firstname $lastname"
read -p "请输入姓氏:" firstname
会把用户输入的内容保存到firstname
变量中
笔记
read
命令用于接收用户输入
-p
选项用于显示提示信息- 用户输入的内容会保存到指定的变量中
小贴士
- 脚本第一行的
#!/bin/bash
称为 shebang,用于指定脚本的解释器 - 良好的注释习惯能让脚本更容易理解和维护
echo -e
中的-e
选项允许解释转义字符
3. 执行脚本
为脚本添加执行权限并运行:
chmod +x fullname.sh # 添加执行权限
./fullname.sh # 方法1:直接运行
# 或者
sh fullname.sh # 方法2:通过sh解释器运行
任务二:根据日期创建文件
实验目的
学习如何结合用户输入和系统日期命令来自动创建文件,掌握变量赋值和字符串拼接的基本操作。
本脚本将实现以下功能:
- 接收用户输入的基础文件名
- 自动获取今天、昨天和前天的日期
- 将基础文件名和日期组合,创建三个文件
1. 创建脚本文件
创建 createfile.sh
并输入以下内容:
#!/bin/bash
# 脚本名:createfile.sh
# 功能:创建带日期后缀的文件
# 作者:Lu
# 让使用者输入文件名称
read -p "请输入文件名:" filename
# 利用date命令获取所需的日期
date1=$(date --date='2 days ago' +%Y%m%d) # 前两天的日期
date2=$(date --date='1 days ago' +%Y%m%d) # 前一天的日期
date3=$(date +%Y%m%d) # 今天的日期
# 组合文件名和日期
file1="${filename}_${date1}"
file2="${filename}_${date2}"
file3="${filename}_${date3}"
# 创建文件
touch "$file1"
touch "$file2"
touch "$file3"
重要说明
- date 命令的使用:
date +%Y%m%d
生成格式如"20240101"的日期--date='n days ago'
可以获取前n天的日期- 注意:
+
号前必须有空格
- 变量赋值:
$(command)
可以将命令的输出赋值给变量- 例如:
date1=$(date --date='2 days ago' +%Y%m%d)
- 字符串拼接:
- 使用
${变量名}
的形式在字符串中引用变量 - 例如:
${filename}_${date1}
将文件名和日期用下划线连接
- 使用
- touch命令:
- 用于创建空文件
- 如果文件已存在,则会更新文件的时间戳
2. 执行脚本
为脚本添加执行权限并运行:
chmod +x createfile.sh # 添加执行权限
./createfile.sh # 方法1:直接运行
# 或者
sh createfile.sh # 方法2:通过sh解释器运行
小贴士
- 使用双引号包围变量可以避免文件名中包含空格时出现的问题
- 可以使用
date --help
查看更多日期格式选项 ls -l
命令可以显示文件的详细信息,包括创建时间
任务三:运算
实验目的
学习如何在Shell脚本中进行基本的数值运算,掌握变量运算的语法。
Bash Shell 提供了多种进行数值运算的方法,最常用的是使用双括号 $(())
语法。需要注意的是,Bash 默认只支持整数运算,不支持浮点数(小数)运算。
1. 创建脚本文件
创建 math.sh
并输入以下内容:
#!/bin/bash
# 脚本名:math.sh
# 功能:接收两个数字并计算它们的乘积
# 作者:Lu
# 提示用户输入
echo -e "请输入两个数字 \n"
read -p "第一个数字: " first
read -p "第二个数字: " second
# 计算乘积
total=$(($first*$second))
# 显示结果
echo -e "\n计算结果: $total"
小贴士
- 运算符两边的空格不是必需的,
$(($first*$second))
和$(( $first * $second ))
都可以 - 在实际开发中,建议使用空格来提高代码的可读性
空格既然是好东西你就多用,代码可读性千万不要留下什么遗憾。(熟悉这句话么?)
重要说明
- 数值运算语法:
$(())
用于进行算术运算- 支持的运算符:
+
(加法)-
(减法)*
(乘法)/
(除法,注意是整除)%
(取模/求余)
- 变量使用注意事项:
- 变量可以直接在
$(())
中使用 - 也可以使用
$
引用变量,如$first
- 变量可以直接在
2. 执行脚本
sh math.sh
# 或者
bash math.sh
任务四:再次了解不同运行方式
(方法一)直接运行
通过脚本文件的绝对或相对路径运行,为了观察效果,我们在运行前先查看下firstname
变量的值:
echo $firstname
./fullname.sh
# 或 /root/scripts/fullname.sh
echo $firstname
(方法二)通过 source
运行
echo $firstname
source fullname.sh
# 或 . fullname.sh
echo $firstname
(方法三)使用 sh/bash 命令解释器
echo $firstname
bash fullname.sh
# 或 sh fullname.sh
echo $firstname
当脚本以直接运行(./fullname.sh
)或通过解释器(sh/bash fullname.sh
)方式执行时:
- 系统会创建一个子 Shell(子 bash)
- 脚本在这个子 Shell 中执行
- 脚本中定义的变量(如 firstname、lastname)只在子shell中有效
- 当脚本执行完毕,子 Shell 终止
- 返回父 Shell 时,这些变量就会消失
整个过程如下图所示:
提示
方法四中的重定向到 bash,与方法三是一样的
如果使用 source 执行,脚本会直接在父 Shell 中执行!
思考
如果脚本中有
exit 0
语句,使用不同方式执行脚本会有什么不同?作业
要求: 编写一个Shell脚本,实现以下功能:
- 提示用户输入学生姓名
- 依次输入3门课的成绩(整数)
- 计算平均分
- 将结果保存到以学生姓名和当天日期命名的文件中
脚本文件名: grade_avg.sh
提示:
- 使用 read 命令接收用户输入
- 使用 date 命令获取当前日期(格式:YYYYMMDD)
- 使用算术运算计算平均分
- 使用 echo 命令将信息写入文件
样例输出:
请输入学生姓名:张三
请输入第一门课成绩:85
请输入第二门课成绩:92
请输入第三门课成绩:88
计算结果已保存到 张三_20240103.txt
文件内容:
学生姓名:张三
第一门课:85
第二门课:92
第三门课:88
平均分:88
这个作业综合运用了:
- 用户交互(read命令)
- 变量使用
- 日期获取(date命令)
- 文件创建和内容写入
- 基本算术运算
部分答案:
# 接收用户输入
read -p "请输入学生姓名:" name
# 获取当前日期
today=$(date +%Y%m%d)
# 创建文件名
filename="${name}_${today}.txt"
# 将信息写入文件
echo "学生姓名:$name" > $filename