8.2 基础Shell脚本

系列 - LINUX Shell脚本

本实验手册涵盖了四个任务,包括编写交互式脚本、根据日期创建文件、进行数值运算和了解不同脚本运行方式。通过这些任务,学习者将掌握 read 命令、变量赋值、日期命令、算术运算和脚本执行的不同方法。

实验目的
学习如何编写一个简单的交互式脚本,掌握 read 命令的基本用法。
交互式脚本
交互式脚本指的是在运行过程中需要用户参与的脚本。它会在特定位置暂停执行,等待用户输入信息,然后根据用户的输入内容继续后续操作。这种人机交互的方式让脚本更加灵活,能够根据不同用户的输入做出相应的响应。

首先,我们需要创建一个专门存放脚本的目录:

bash

cd                  # 切换到家目录
mkdir scripts       # 创建scripts目录
cd scripts          # 进入scripts目录

使用文本编辑器(如 vim)创建并编写脚本文件 fullname.sh

bash

#!/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 选项允许解释转义字符

为脚本添加执行权限并运行:

bash

chmod +x fullname.sh     # 添加执行权限
./fullname.sh           # 方法1:直接运行
# 或者
sh fullname.sh          # 方法2:通过sh解释器运行

实验目的
学习如何结合用户输入和系统日期命令来自动创建文件,掌握变量赋值和字符串拼接的基本操作。

本脚本将实现以下功能:

  1. 接收用户输入的基础文件名
  2. 自动获取今天、昨天和前天的日期
  3. 将基础文件名和日期组合,创建三个文件

创建 createfile.sh 并输入以下内容:

bash

#!/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"

重要说明

  1. date 命令的使用
    • date +%Y%m%d 生成格式如"20240101"的日期
    • --date='n days ago' 可以获取前n天的日期
    • 注意:+ 号前必须有空格
  2. 变量赋值
    • $(command) 可以将命令的输出赋值给变量
    • 例如:date1=$(date --date='2 days ago' +%Y%m%d)
  3. 字符串拼接
    • 使用 ${变量名} 的形式在字符串中引用变量
    • 例如:${filename}_${date1} 将文件名和日期用下划线连接
  4. touch命令
    • 用于创建空文件
    • 如果文件已存在,则会更新文件的时间戳

为脚本添加执行权限并运行:

bash

chmod +x createfile.sh     # 添加执行权限
./createfile.sh           # 方法1:直接运行
# 或者
sh createfile.sh          # 方法2:通过sh解释器运行

小贴士
  • 使用双引号包围变量可以避免文件名中包含空格时出现的问题
  • 可以使用 date --help 查看更多日期格式选项
  • ls -l 命令可以显示文件的详细信息,包括创建时间
实验目的
学习如何在Shell脚本中进行基本的数值运算,掌握变量运算的语法。

Bash Shell 提供了多种进行数值运算的方法,最常用的是使用双括号 $(()) 语法。需要注意的是,Bash 默认只支持整数运算,不支持浮点数(小数)运算

创建 math.sh 并输入以下内容:

bash

#!/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 )) 都可以
  • 在实际开发中,建议使用空格来提高代码的可读性

空格既然是好东西你就多用,代码可读性千万不要留下什么遗憾。(熟悉这句话么?)

重要说明

  1. 数值运算语法
    • $(()) 用于进行算术运算
    • 支持的运算符:
      • + (加法)
      • - (减法)
      • * (乘法)
      • / (除法,注意是整除)
      • % (取模/求余)
  2. 变量使用注意事项
    • 变量可以直接在 $(()) 中使用
    • 也可以使用 $ 引用变量,如 $first

bash

sh math.sh
# 或者
bash math.sh

通过脚本文件的绝对或相对路径运行,为了观察效果,我们在运行前先查看下firstname变量的值:

bash

echo $firstname
./fullname.sh
# 或 /root/scripts/fullname.sh
echo $firstname

bash

echo $firstname
source fullname.sh
# 或 . fullname.sh
echo $firstname

bash

echo $firstname
bash fullname.sh
# 或 sh fullname.sh
echo $firstname

当脚本以直接运行(./fullname.sh)或通过解释器(sh/bash fullname.sh)方式执行时:

  1. 系统会创建一个子 Shell(子 bash)
  2. 脚本在这个子 Shell 中执行
  3. 脚本中定义的变量(如 firstname、lastname)只在子shell中有效
  4. 当脚本执行完毕,子 Shell 终止
  5. 返回父 Shell 时,这些变量就会消失

整个过程如下图所示:

提示
方法四中的重定向到 bash,与方法三是一样的

如果使用 source 执行,脚本会直接在父 Shell 中执行!

思考
如果脚本中有 exit 0 语句,使用不同方式执行脚本会有什么不同?

要求: 编写一个Shell脚本,实现以下功能:

  1. 提示用户输入学生姓名
  2. 依次输入3门课的成绩(整数)
  3. 计算平均分
  4. 将结果保存到以学生姓名和当天日期命名的文件中

脚本文件名: grade_avg.sh

提示:

  • 使用 read 命令接收用户输入
  • 使用 date 命令获取当前日期(格式:YYYYMMDD)
  • 使用算术运算计算平均分
  • 使用 echo 命令将信息写入文件

样例输出:

text

请输入学生姓名:张三
请输入第一门课成绩:85
请输入第二门课成绩:92
请输入第三门课成绩:88

计算结果已保存到 张三_20240103.txt

文件内容:

text

学生姓名:张三
第一门课:85
第二门课:92
第三门课:88
平均分:88

这个作业综合运用了:

  • 用户交互(read命令)
  • 变量使用
  • 日期获取(date命令)
  • 文件创建和内容写入
  • 基本算术运算

部分答案:

bash

# 接收用户输入
read -p "请输入学生姓名:" name

# 获取当前日期
today=$(date +%Y%m%d)

# 创建文件名
filename="${name}_${today}.txt"

# 将信息写入文件
echo "学生姓名:$name" > $filename

相关内容