Shell脚本-随机数实战案例

在Shell脚本编程中,生成随机数是一项非常实用的技能。无论是用于模拟、测试、游戏开发还是安全相关的应用(如生成密码),能够灵活地生成随机数都是非常有用的。本文将通过几个实际的应用案例来展示如何在Shell脚本中使用随机数解决问题。

案例一:猜数字游戏

创建一个简单的命令行猜数字游戏,玩家需要猜测由脚本随机生成的一个数字。

脚本示例:

#!/bin/bashnumber=$((RANDOM % 100 + 1)) # 生成1到100之间的随机数
guess=-1echo "Guess the number between 1 and 100."while [ $guess -ne $number ]; doread -p "Enter your guess: " guessif [ $guess -lt $number ]; thenecho "Too low!"elif [ $guess -gt $number ]; thenecho "Too high!"elseecho "Congratulations! You guessed it right."fi
done

说明:

  • 使用$RANDOM生成1到100之间的随机整数。
  • while循环持续进行直到用户猜对为止。
  • 根据用户的输入给出相应的提示信息。

案例二:文件名随机化

假设你需要批量重命名一组文件,并希望新文件名是随机生成的字符串。

脚本示例:

#!/bin/bashdirectory="/path/to/your/files"
cd "$directory" || exitfor file in *; doextension="${file##*.}"new_name="$(date +%s%N)-$RANDOM.$extension" # 使用时间戳和随机数作为新文件名mv "$file" "$new_name"echo "Renamed '$file' to '$new_name'"
done

说明:

  • for file in *遍历指定目录下的所有文件。
  • 使用当前时间戳(纳秒精度)和随机数组合成新的文件名。
  • mv "$file" "$new_name"执行重命名操作。

案例三:数据库查询结果随机排序

有时你可能希望从数据库查询的结果中随机选择几条记录,或者随机打乱查询结果的顺序。

脚本示例:

#!/bin/bashdb_user="your_db_user"
db_password="your_db_password"
db_name="your_db_name"query="SELECT * FROM your_table ORDER BY RAND() LIMIT 5;" # MySQL示例
mysql -u "$db_user" -p"$db_password" "$db_name" -e "$query"

说明:

  • ORDER BY RAND()用于MySQL数据库,可以随机排列查询结果。
  • -e选项允许直接在命令行中执行SQL语句。
  • 注意:这种方法对于大数据集可能会比较慢,因为它需要为每一行分配随机值并排序。

案例四:生成随机密码

编写一个脚本来生成指定长度的随机密码,适用于需要定期更换密码或为新用户生成初始密码的情况。

脚本示例:

#!/bin/bashlength=12
password=$(< /dev/urandom tr -dc 'A-Za-z0-9!@#$%^&*()' | head -c $length)
echo "Generated password: $password"

说明:

  • < /dev/urandom tr -dc 'A-Za-z0-9!@#$%^&*()'/dev/urandom读取数据,并过滤出所需的字符集。
  • head -c $length截取指定长度的字符串作为密码。

案例五:随机抽奖

假设你需要从一组参与者中随机抽取若干幸运儿,例如举办活动时进行抽奖。

脚本示例:

#!/bin/bashparticipants=("Alice" "Bob" "Charlie" "David" "Eve")
number_of_winners=3for ((i=0; i<number_of_winners; i++)); doindex=$((RANDOM % ${#participants[@]}))winner=${participants[$index]}echo "Winner $((i+1)): $winner"unset participants[$index] # 移除已抽中的参与者以避免重复participants=("${participants[@]}") # 重新索引数组
done

说明:

  • ${#participants[@]}获取数组的长度。
  • unset participants[$index]移除已经抽中的参与者。
  • 重新索引数组确保后续抽取不会受到之前操作的影响。

结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试算法高频08-动态规划-03

练习题 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每…

基于 EFISH-SBC-RK3588 的无人机多光谱/红外热成像边缘计算方案

一、硬件架构设计‌ ‌核心算力平台&#xff08;EFISH-SBC-RK3588&#xff09;‌ ‌处理器性能‌&#xff1a;搭载 8 核 ARM 架构&#xff08;4Cortex-A762.4GHz 4Cortex-A551.8GHz&#xff09;&#xff0c;集成 6 TOPS NPU 与 Mali-G610 GPU&#xff0c;支持多光谱图像实时融…

Python小酷库系列:pyNest,把FastAPI程序写出Spring的味道

pyNest&#xff0c;把FastAPI程序写出Spring的风格 快速入门1、安装pyNest2、创建项目3、编写app_module.py4、编写app_service.py5、编写app_controller.py6、编写main.py7、启动程序 核心概念1、Modules2、Controllers3、Providers4、ORM Provider NestJS是风靡于Node.js圈的…

HTML 详解:从基础结构到语义标签

目录 一、HTML 是什么&#xff1f;二、HTML 的基本结构✅ 简要说明&#xff1a; 三、常见 HTML 标签讲解3.1 标题标签 <h1> ~ <h6>3.2 段落和换行3.3 超链接3.4 图像插入3.5 列表无序列表&#xff1a;有序列表&#xff1a; 3.6 表格结构 四、HTML 语义化标签详解五…

用Python做有趣的AI项目 6:AI音乐生成器(LSTM Melody Generator)

&#x1f3b5; 项目名称&#xff1a;AI音乐生成器&#xff08;LSTM Melody Generator&#xff09; &#x1f9e0; 项目简介 这个项目的目标是&#xff1a;用 AI 来自动生成简单的旋律&#xff08;MIDI格式&#xff09;&#xff0c;类似于基础的钢琴曲、背景音乐片段。 我们使…

【运维】利用任务计划程序定时重启 nssm 服务 | Windows 服务每日定时维护实践

&#x1f680; 利用任务计划程序定时重启 nssm 服务 | Windows 服务每日定时维护实践 一、前言 在 Windows 系统中&#xff0c;nssm&#xff08;Non-Sucking Service Manager&#xff09; 是一个非常好用的工具&#xff0c;可以将任意可执行程序注册为系统服务。很多运维场景…

MATLAB小试牛刀系列(1)

问题描述 某机床厂生产甲、乙两种机床&#xff0c;每台机床销售后的利润分别为 4 千元与 3 千元。生产甲机床需用 A、B 机器加工&#xff0c;加工时间分别为每台 2h 和每台 1h&#xff1b;生产乙机床需用 A、B、C 三种机器加工&#xff0c;加工时间均为每台 1h。若每天可用于加…

云原生周刊:Kubernetes v1.33 正式发布

开源项目推荐 Robusta Robusta 是一个开源的 K8s 可观测性与自动化平台&#xff0c;旨在增强 Prometheus 告警的智能化处理能力。它通过规则和 AI 技术对告警进行丰富化处理&#xff0c;自动附加相关的 Pod 日志、图表和可能的修复建议&#xff0c;支持智能分组、自动修复和高…

React速通笔记

相关视频&#xff1a; 黑马程序员前端React18入门到实战视频教程&#xff0c;从reacthooks核心基础到企业级项目开发实战&#xff08;B站评论、极客园项目等&#xff09;及大厂面试全通关_哔哩哔哩_bilibili 一、React介绍 React由Meta公司开发&#xff0c;是一个用于 构建W…

人工智能与机器学习:Python从零实现K-Means 算法

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…

【神经网络与深度学习】训练集与验证集的功能解析与差异探究

引言 在深度学习模型的训练过程中&#xff0c;训练集和验证集是两个关键组成部分&#xff0c;它们在模型性能的提升和评估中扮演着不可替代的角色。通过分析这两者的区别和作用&#xff0c;可以帮助我们深入理解模型的学习过程和泛化能力&#xff0c;同时为防止过拟合及优化超…

Macos m系列芯片环境下python3安装mysqlclient系列问题

最近学习python3&#xff0c;在安装mysqlclient的时候遇到了一些问题&#xff0c;直接使用哦pip install mysqlclient 直接报错了&#xff0c;记录一下解决方案。 环境信息 设备&#xff1a;Macbook Pro m1 系统&#xff1a;macos Sequoia 15.3.2 最终成功的python版本&#xf…

微信小程序-van-uploader的preview-size

preview-size支持数组格式 修改前修改后1、升级微信小程序里面的van版本:2、 重新构建npm3、重启微信开发工具 修改前 引用van组件的上传文件&#xff0c;设置预览图尺寸&#xff0c;刚开始设置的是preview-size“140”&#xff0c;出来的效果就是一个正方形。 修改后 1、升级…

2. 第一个网页:前端基础入门

第一个网页&#xff1a;前端基础入门 一、网页文件基础认知 1. 文件扩展名 .htm 或 .html 均为网页文件后缀&#xff0c;二者功能完全一致扩展名隐藏方法 系统设置 → 文件夹选项 → 查看 → 取消勾选「隐藏已知文件类型的扩展名」 二、前端发展简史 1. 浏览器战争与标准混…

云原生--核心组件-容器篇-7-Docker私有镜像仓库--Harbor

1、Harbor的定义与核心作用 定义&#xff1a; Harbor是由VMware开源的企业级容器镜像仓库系统&#xff0c;后捐赠给 CNCF (Cloud Native Computing Foundation)。它基于Docker Registry扩展了企业级功能&#xff0c;用于存储、分发和管理容器镜像&#xff08;如Docker、OCI标准…

Java项目与技术栈场景题深度解析

Java项目与技术栈场景题深度解析 在互联网大厂Java求职者的面试中&#xff0c;经常会被问到关于Java项目或技术栈的场景题。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官&#xff1a;马架构&#xff0c;欢迎来到我们公司的面试现场。请问您对Java…

SpringMVC 静态资源处理 mvc:default-servlet-handler

我们先来看看效果,当我把这一行注释掉的时候&#xff1a; 我们来看看页面&#xff1a; 现在我把注释去掉&#xff1a; 、 可以看到的是&#xff0c;这个时候又可以访问了 那么我们就可以想&#xff0c;这个 <mvc:default-servlet-handler />它控制着我们页面的访问…

【leetcode】最长公共子路径问题

滚动hash 滚动哈希&#xff08;rolling hash&#xff09;也叫 Rabin-Karp 字符串哈希算法&#xff0c;它是将某个字符串看成某个进制下的整数&#xff0c;并将其对应的十进制整数作为hash值。 滚动hash算法的推导 假设有一个长度为n的数组a[0],a[1],a[2],…a[n-1]&#xff0…

【Linux网络】:套接字之UDP

一、UDP和TCP协议 TCP &#xff08;Transmission Control Protocol 传输控制协议&#xff09;的特点&#xff1a; 传输层协议有连接&#xff08;在正式通信前要先建立连接&#xff09;可靠传输&#xff08;在内部帮我们做可靠传输工作&#xff09;面向字节流 UDP &#xff08;U…

React19 useOptimistic 用法

用法 乐观更新 发起异步请求时&#xff0c;先假设请求会成功立即更新 UI 给用户反馈若请求最终失败&#xff0c;再将 UI 恢复到之前的状态 const [optimisticState, addOptimistic] useOptimistic(state, updateFn) 参数 state&#xff1a;实际值&#xff0c;可以是 useSta…