shell编程求10个随机数的最大值与最小值

shell编程求10个随机数的最大值与最小值

一、核心知识铺垫

1. 脚本基础

Shell脚本是Linux下的批处理文件(后缀.sh),需用bash解释器执行,执行前需通过chmod +x 脚本名.sh赋予执行权限,运行方式为./脚本名.sh

2. 关键语法与原理

语法/变量 作用与原理
read -p "提示语" 变量 读取用户输入并存储到变量,-p用于显示输入提示,支持默认值(用户回车时生效)
$RANDOM bash内置随机数(0-32767),指定区间公式:start + $RANDOM % (end - start + 1)+1是为了包含结束值
$(( 算术表达式 )) 内置整数计算,支持加减乘除、取余,用于随机数生成、极值对比
for ((i=1; i<=n; i++)) 固定次数循环,用于重复生成随机数并对比极值
[[ 条件 ]]if 条件判断,用于验证输入合法性(是否为正整数、范围是否有效)
极值初始化 用随机数起始值start初始化最大值、结束值end初始化最小值,确保覆盖所有生成的随机数

二、脚本

bash 复制代码
#!/bin/bash
# 功能:生成自定义范围、自定义个数的随机数,计算并输出最大值和最小值
# 日期:2025-12-03

# 1. 读取用户输入(支持默认值:生成个数默认10)
read -p "请输入随机数起始值(正整数):" start
read -p "请输入随机数结束值(正整数,需大于起始值):" end
read -p "请输入生成随机数的个数(正整数,默认10可直接回车):" count

# 2. 输入处理与合法性验证(避免无效输入导致脚本崩溃)
[[ -z $count ]] && count=10  # 处理生成个数默认值
if ! [[ $start =~ ^[0-9]+$ && $end =~ ^[0-9]+$ && $count =~ ^[0-9]+$ ]]; then
    echo -e "\n 错误:起始值、结束值、生成个数必须是正整数!"
    exit 1
elif (( start >= end )); then
    echo -e "\n 错误:起始值必须小于结束值!"
    exit 1
elif (( count < 1 )); then
    echo -e "\n 错误:生成个数必须≥1!"
    exit 1
fi

# 3. 核心计算:随机数范围跨度+极值初始化
range=$(( end - start + 1 ))
max_num=$start  # 初始值设为区间最小值,确保能更新
min_num=$end    # 初始值设为区间最大值,确保能更新

# 4. 循环生成随机数并对比极值
echo -e "\n 生成的$count个[$start-$end]之间的随机数为:"
for ((i=1; i<=count; i++)); do
    random_num=$(( start + RANDOM % range ))  # 生成指定区间随机数
    echo -n "$random_num "  # 打印随机数(空格分隔)
    
    # 更新最大值和最小值
    (( random_num > max_num )) && max_num=$random_num
    (( random_num < min_num )) && min_num=$random_num
done

# 5. 输出最终结果
echo -e "\n\n------------------------"
echo " 统计结果:"
echo "生成个数:$count 个 | 数值范围:[$start-$end]"
echo "最大值:$max_num | 最小值:$min_num"
echo "------------------------"

三、操作步骤

1. 创建并编辑脚本

打开Linux终端(或Windows WSL、Git Bash),执行以下命令:

bash 复制代码
touch random_min_max.sh  # 创建空脚本文件
nano random_min_max.sh   # 编辑文件

复制上面的"完整整合脚本"内容,粘贴到文件中,按Ctrl+O保存,Enter确认,Ctrl+X退出。

2. 赋予执行权限

bash 复制代码
chmod +x random_min_max.sh  # 给脚本添加执行权限

3. 运行脚本并测试

bash 复制代码
./random_min_max.sh  # 执行脚本

按提示输入参数(示例:起始值10、结束值50、个数10,生成个数直接回车则默认10),运行效果如下:

复制代码
请输入随机数起始值(正整数):10
请输入随机数结束值(正整数,需大于起始值):50
请输入生成随机数的个数(正整数,默认10可直接回车):

 生成的10个[10-50]之间的随机数为:
32 15 47 23 10 42 38 29 18 50 

------------------------
 统计结果:
生成个数:10 个 | 数值范围:[10-50]
最大值:50 | 最小值:10
------------------------

4. 异常输入测试(容错性验证)

  • 输入非整数(如起始值abc):提示"必须是正整数"并退出;
  • 起始值≥结束值(如20和10):提示"起始值必须小于结束值"并退出;
  • 生成个数0:提示"生成个数必须≥1"并退出。

脚本命令逐行详细讲解

bash 复制代码
#!/bin/bash
  • 功能 :指定脚本的解释器为bash(Linux默认Shell)。
  • 原理 :脚本文件头部的"谢邦"(Shebang)标识,告诉系统用哪个程序执行后续代码,不同Shell(如sh、zsh)语法有差异,bash是最通用的选择。
  • 注意:必须放在脚本第一行,否则系统可能用默认Shell执行,导致语法报错。
bash 复制代码
# 功能:生成自定义范围、自定义个数的随机数,计算并输出最大值和最小值
# 作者:Shell实战教程
# 日期:2025-12-03
  • 功能:注释(不会被执行),用于说明脚本用途、作者、日期等信息。
  • 原理 :Shell中#开头的行视为注释,仅用于增强代码可读性,系统执行时会跳过。
  • 建议:复杂脚本建议添加注释,方便后续维护或他人理解。
bash 复制代码
read -p "请输入随机数起始值(正整数):" start
  • 功能 :读取用户输入的"随机数起始值",并存储到变量start中。
  • 原理
    • read:Shell内置命令,用于从终端读取用户输入;
    • -p "提示语":可选参数,在读取输入前显示提示信息,引导用户操作;
    • start:变量名,用户输入的内容会被赋值给这个变量(变量名可自定义,遵循"字母+数字+下划线",不能以数字开头)。
  • 示例 :用户输入10,则变量start的值为10
bash 复制代码
read -p "请输入随机数结束值(正整数,需大于起始值):" end
  • 功能 :读取用户输入的"随机数结束值",存储到变量end中。
  • 原理 :与上一条read命令一致,仅变量名和提示语不同,用于存储区间的结束边界。
  • 示例 :用户输入50,则变量end的值为50
bash 复制代码
read -p "请输入生成随机数的个数(正整数,默认10可直接回车):" count
  • 功能 :读取用户输入的"随机数生成个数",存储到变量count中,支持用户直接回车(默认值10)。
  • 原理 :若用户未输入内容直接回车,变量count会为空(-z $count为真),后续会处理默认值。
  • 示例 :用户直接回车,count为空;输入15,则count的值为15
bash 复制代码
[[ -z $count ]] && count=10
  • 功能 :处理count的默认值,若用户未输入(变量为空),则将count设为10。
  • 原理
    • [[ -z $count ]]:条件判断,-z表示"判断变量是否为空",若count为空则条件为真;
    • &&:逻辑"与",前面的条件为真时,才执行后面的命令;
    • count=10:给变量count赋值为10。
  • 简化逻辑 :等价于if [[ -z $count ]]; then count=10; fi,用&&精简代码。
bash 复制代码
if ! [[ $start =~ ^[0-9]+$ && $end =~ ^[0-9]+$ && $count =~ ^[0-9]+$ ]]; then
  • 功能 :验证startendcount是否均为正整数,若不满足则执行后续错误提示。
  • 原理
    • if:条件判断语句,后面的条件为真时,执行then后的代码;
    • !:逻辑"非",反转后面的条件结果(原条件为真则变为假,原条件为假则变为真);
    • [[ $变量 =~ 正则表达式 ]]:Shell内置的正则匹配语法,用于判断变量是否符合指定格式;
    • ^[0-9]+$:正则表达式,^表示字符串开头,[0-9]表示0-9的数字,+表示1个及以上,$表示字符串结尾,整体匹配"正整数";
    • &&:逻辑"与",要求三个变量的正则匹配均为真(即均为正整数),整个条件才为真。
  • 示例 :若start=abc(非数字),则$start =~ ^[0-9]+$为假,三个条件的"与"结果为假,加上!后条件为真,进入错误处理。
bash 复制代码
echo -e "\n❌ 错误:起始值、结束值、生成个数必须是正整数!"
  • 功能:输出错误提示信息,告知用户输入不符合"正整数"要求。
  • 原理
    • echo:Shell内置命令,用于输出字符串;
    • -e:可选参数,支持解析转义字符(如\n表示换行);
    • \n:换行符,让错误提示与前面的输入内容分隔开,更易读;
    • :Unicode字符(终端支持时显示),增强提示的视觉效果。
bash 复制代码
exit 1
  • 功能:异常退出脚本,终止后续代码执行。
  • 原理
    • exit:Shell内置命令,用于退出当前脚本;
    • 1:退出状态码(0表示正常退出,非0表示异常退出),便于后续脚本调用时判断执行结果。
  • 必要性:输入非法时若不退出,后续代码会因变量值无效报错(如用非数字计算),因此需主动终止。
bash 复制代码
elif (( start >= end )); then
  • 功能 :若前一个条件不成立(输入均为正整数),则验证"起始值是否小于结束值",若不满足(start >= end)则执行后续错误提示。
  • 原理
    • elifif的补充语句,前面的if条件为假时,判断当前条件;
    • (( 算术表达式 )):Shell内置的算术条件判断语法,支持整数比较(>=表示"大于等于");
    • 核心逻辑:确保随机数区间[start, end]有效(如拒绝start=20,end=10)。
bash 复制代码
echo -e "\n❌ 错误:起始值必须小于结束值!"
  • 功能 :输出"起始值大于等于结束值"的错误提示,与前文echo命令原理一致。
bash 复制代码
exit 1
  • 功能:异常退出脚本,原理同上。
bash 复制代码
elif (( count < 1 )); then
  • 功能 :若前两个条件均不成立,验证"生成个数是否≥1",若不满足(count < 1)则执行错误提示。
  • 原理count是生成随机数的次数,必须为≥1的正整数(如拒绝count=0)。
bash 复制代码
echo -e "\n❌ 错误:生成个数必须≥1!"
  • 功能:输出"生成个数无效"的错误提示。
bash 复制代码
exit 1
  • 功能:异常退出脚本。
bash 复制代码
fi
  • 功能 :结束if-elif条件判断结构。
  • 原理if语句必须以fi收尾(fiif的反向拼写),标志条件判断的结束,否则脚本会报错。
bash 复制代码
range=$(( end - start + 1 ))
  • 功能:计算随机数区间的跨度,用于后续生成指定范围的随机数。
  • 原理
    • $(( 算术表达式 )):Shell内置的算术计算语法,支持整数运算(减、加);
    • 跨度公式:end - start + 1,核心是"包含结束值"。例如start=10,end=50,跨度为50-10+1=41,确保$RANDOM % 41生成0-40,加start后得到10-50(包含50);
    • 若不加1:跨度为40$RANDOM %40生成0-39,最大随机数为49(缺失50)。
bash 复制代码
max_num=$start
  • 功能 :初始化"最大值变量"max_num,初始值设为start(区间的最小边界)。
  • 原理 :确保后续生成的随机数都≥max_num的初始值,首次比较时能正确更新最大值(若初始值设为0,当start=100时,随机数100会大于0,但初始值未覆盖区间,逻辑错误)。
bash 复制代码
min_num=$end
  • 功能 :初始化"最小值变量"min_num,初始值设为end(区间的最大边界)。
  • 原理 :确保后续生成的随机数都≤min_num的初始值,首次比较时能正确更新最小值(同理,初始值不能设为固定大数字)。
bash 复制代码
echo -e "\n✅ 生成的$count个[$start-$end]之间的随机数为:"
  • 功能:输出提示信息,告知用户即将显示生成的随机数。
  • 原理
    • $count$start$end:引用变量的值(Shell中用$变量名引用变量内容);
    • 示例:count=10,start=10,end=50,则输出"✅ 生成的10个[10-50]之间的随机数为:"。
bash 复制代码
for ((i=1; i<=count; i++)); do
  • 功能 :固定次数循环,循环次数为count(用户指定的随机数个数)。
  • 原理
    • for ((初始化; 循环条件; 步长)):bash内置的固定次数循环语法;
    • i=1:初始化循环变量i为1(循环起始值);
    • i<=count:循环条件,只要i小于等于count,就继续循环;
    • i++:步长,每次循环结束后i加1(避免无限循环);
    • do:循环体开始标识,后续代码会重复执行count次。
  • 示例count=10,则循环执行10次(i从1到10)。
bash 复制代码
random_num=$(( start + RANDOM % range ))
  • 功能 :生成[start, end]区间内的随机数,存储到变量random_num中。
  • 原理
    • $RANDOM:bash内置随机数变量,默认生成0-32767之间的整数(无需额外安装工具);
    • RANDOM % range:取余运算,将$RANDOM的范围缩小到0-(range-1)(如range=41,则0-40);
    • start + 结果:将缩小后的范围平移到start-(start+range-1),而start+range-1 = start + (end-start+1) -1 = end,最终得到[start, end]区间的随机数。
  • 示例start=10,range=41,则10 + (0-40)10-50之间的随机数。
bash 复制代码
echo -n "$random_num "
  • 功能:打印当前生成的随机数,多个随机数用空格分隔(不换行)。
  • 原理
    • -necho的可选参数,禁止自动换行(默认echo会在结尾加换行符);
    • 示例:循环10次,会将10个随机数打印在同一行,用空格分隔,更整洁。
bash 复制代码
(( random_num > max_num )) && max_num=$random_num
  • 功能 :更新最大值,若当前随机数大于max_num,则将max_num改为当前随机数。
  • 原理
    • (( random_num > max_num )):算术条件判断,判断当前随机数是否大于当前最大值;
    • &&:逻辑"与",条件为真时执行后面的赋值命令;
    • 简化逻辑:等价于if (( random_num > max_num )); then max_num=$random_num; fi,用&&精简代码。
  • 示例max_num=10(初始值),当前随机数32,则32>10为真,max_num更新为32
bash 复制代码
(( random_num < min_num )) && min_num=$random_num
  • 功能 :更新最小值,若当前随机数小于min_num,则将min_num改为当前随机数。
  • 原理 :与上一条命令一致,仅判断条件改为"小于"(<)。
  • 示例min_num=50(初始值),当前随机数15,则15<50为真,min_num更新为15
bash 复制代码
done
  • 功能 :结束for循环,标志循环体的结束。
  • 原理 :与for配对使用,循环条件不满足时(i>count),退出循环,执行后续代码。
bash 复制代码
echo -e "\n\n------------------------"
  • 功能:输出两个换行符和分隔线,用于分隔随机数列表和统计结果,提升可读性。
  • 原理\n\n表示两个换行(空出一行),-组成的分隔线让结果区域更清晰。
bash 复制代码
echo "📊 统计结果:"
  • 功能 :输出统计结果的标题,用📊增强视觉提示。
bash 复制代码
echo "生成个数:$count 个 | 数值范围:[$start-$end]"
  • 功能:输出用户输入的核心参数(生成个数、数值范围),便于用户核对。
  • 原理 :用|分隔两个信息,一行显示,简洁明了,$count$start$end引用变量值。
bash 复制代码
echo "最大值:$max_num | 最小值:$min_num"
  • 功能:输出最终计算的最大值和最小值。
  • 原理 :引用max_nummin_num变量(循环中已更新为最终极值),用|分隔,清晰易读。
bash 复制代码
echo "------------------------"
  • 功能:输出分隔线,结束统计结果区域,让整体输出更规整。
相关推荐
星哥说事1 小时前
恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击
linux·服务器
上78将1 小时前
JVM回收垃圾机制
java·开发语言·jvm
恋猫de小郭1 小时前
解读 Claude 对开发者的影响:AI 如何在 Anthropic 改变工作?
android·前端·ai编程
BD_Marathon1 小时前
【IDEA】IDEA的详细设置
java·ide·intellij-idea
未来coding1 小时前
Spring AI ChatModel API 详解【基于官方文档】
java·后端·spring
m0_740043731 小时前
Vue 组件及路由2
前端·javascript·vue.js
奋斗吧程序媛1 小时前
Vue2 + ECharts 实战:动态一个关键词或动态多关键词筛选折线图,告别数据重叠难题
前端·javascript·echarts
忘记9261 小时前
重复注解的机制是什么
java
喜欢流萤吖~1 小时前
Servlet 生命周期详解
java·servlet