当前位置: 首页 > news >正文

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]移除已经抽中的参与者。
  • 重新索引数组确保后续抽取不会受到之前操作的影响。

结语

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

相关文章:

  • 排序--数据结构初阶(4)(C/C++)
  • Vuex(二) —— 用Vuex完成购物车案例
  • Python3:Jupyterlab 安装和配置
  • yolov5 源码 +jupyter notebook 笔记 kaggle
  • 贪心算法-2208.将数组和减半的最小操作数-力扣(LeetCode)
  • 喷泉码在物联网场景下的案例分析
  • 安达发|高效智能塑料切割数控系统 - 全自动化软件解决方案
  • 使用python实现自动化拉取压缩包并处理流程
  • 怎么样才能在idea中写入spark程序
  • 如何在 IntelliJ IDEA 中编写 Speak 程序
  • 2023ICPC合肥题解
  • 深入解读:2024数据资产场景化评估案例手册(第二期)【附全文阅读】
  • Linux中的系统延时任务和定时任务与时间同步服务和构建时间同步服务器
  • 大模型的scaling laws:Scaling Laws for Neural Language Models
  • Prompt Engineering 提示工程:释放大语言模型潜力的关键技术与实践指南
  • 大语言模型(LLMs)微调技术总结
  • TensorFlow深度学习实战——基于循环神经网络的文本生成模型
  • es+kibana---集群部署
  • vscode 使用gitcode团队管理项目
  • 推荐一个微软官方开源浏览器自动化工具,可以用于UI自动化测试、爬虫等,具备.Net、Java、Python等多个版本!
  • 四川落马厅官周海琦受审,1000余人接受警示教育
  • 第一集丨《无尽的尽头》值得关注,《榜上佳婿》平平无奇
  • 2025厦门体育产业采风活动圆满举行
  • 哈马斯同意释放剩余所有以方被扣押人员,以换取停火五年
  • 俄方证实俄总统普京正在会见美特使威特科夫
  • 美总统批准海底采矿,外交部:擅自授权开发损害国际社会共同利益