--作者:飞翔的小胖猪

--创建时间:2021年5月16日

--修改时间:2021年5月16日

说明

运行脚本,用户手动输入信息生成身份证号。该程序的核心在于函数模块化及select的使用。

注意:该程序仅限于学习使用!请勿挪作它用!切勿用于非法用途!非法使用造成的一切后果由自己承担,与本作者无关。

文件说明

程序主要有4类文件组成,分为主程序脚本、子程序脚本、省份列表文件、城市列表文件。

id_card_generation.sh:主程序脚本文件

sub_choice_province.sh:子程序脚本文件

config/provic.txt:省级列表文件

config/place_name/${城市}.info:省级下城市名文件

目录展示

  1. ├── config
  2.    ├── place_name
  3.       ├── 上海市.info
  4.       ├── 云南省.info
  5.       ├── 内蒙古自治区.info
  6.       ├── 北京市.info
  7.       ├── 台湾省.info
  8.       ├── ........info
  9.       ├── ........info
  10.       ├── .........info
  11.       ├── ...........info
  12.       ├── 贵州省.info
  13.       ├── 辽宁省.info
  14.       ├── 重庆市.info
  15.       ├── 陕西省.info
  16.       ├── 青海省.info
  17.       ├── 香港特别行政区.info
  18.       ├── 黑龙江.info
  19.       └── 黑龙江省.info
  20.    └── provic.txt
  21. ├── id_card_generation.sh
  22. └── sub_choice_province.sh

配置文件

注意:出于安全考虑,仅展示配置文件中部分内容。读者可以根据展示的配置文件格式自行完整配置文件格式。

config/provic.txt

  1. [root@135 config]# cat provic.txt
  2. 北京市
  3. 天津市
  4. 河北省
  5. 山西省
  6. ........
    ........
    ........
  7. 新疆维吾尔自治区

config/place_name/贵州省.info

  1. [root@135 61_id_card_generation]# cat config/place_name/贵州省.info
  2. 520000 贵州省 贵州省
  3. 520100 贵阳市 贵阳市
  4. 520101 贵阳市 市辖区
  5. 520102 贵阳市 南明区
  6. 520103 贵阳市 云岩区
  7. 520111 贵阳市 花溪区
  8. 520112 贵阳市 乌当区
  9. 520113 贵阳市 白云区
  10. ...................
    ...................
    ...................522722 黔南布依族苗族自治州 荔波县
  11. 522723 黔南布依族苗族自治州 贵定县
  12. 522725 黔南布依族苗族自治州 瓮安县
  13. 522726 黔南布依族苗族自治州 独山县
  14. 522727 黔南布依族苗族自治州 平塘县
  15. 522728 黔南布依族苗族自治州 罗甸县
  16. 522729 黔南布依族苗族自治州 长顺县
  17. 522730 黔南布依族苗族自治州 龙里县
  18. 522731 黔南布依族苗族自治州 惠水县
  19. 522732 黔南布依族苗族自治州 三都水族自治县

主程序主体

  1. [root@135 61_id_card_generation]# cat id_card_generation.sh
  2. #!/bin/bash
  3.  
  4. #显示程式版本号及提示信息函数
  5. display_version(){
  6. echo -e '\e[34m##########################################################\e[0m'
  7. echo -e '\e[34m## ##\e[0m'
  8. echo -e '\e[34m## 身份证生成程式-v.1.0 ##\e[0m'
  9. echo -e '\e[34m## ##\e[0m'
  10. echo -e '\e[34m##########################################################\e[0m'
  11. log::warn "脚本仅作为学习使用,切勿挪作它用!!!!!!!\n"
  12. }
  13.  
  14. #定义错误等级的输入格式为红色
  15. log::err() {
  16. printf "\033[31m ERROR: \033[0m$@\n"
  17. }
  18.  
  19. #定义成功等级的输入格式为绿色
  20. log::info() {
  21. printf "\033[32m SUCCESS: \033[0m$@\n"
  22. }
  23.  
  24. #定义告警等级的输入格式为黄色
  25. log::warn() {
  26. printf "\033[33mWARNING: \033[0m$@\n"
  27. }
  28.  
  29. #获取性别信息函数
  30. input_sex(){
  31. read -p "--你的性别:" sex_i
  32. if [ ! ${sex_i} ];then
  33. log::err "性别不能为空!"
  34. input_sex
  35. fi
  36.  
  37. if [ ${sex_i} == '男' ] || [ ${sex_i} == '女' ];then
  38. log::info "性别输入正常!" > /dev/null
  39. gener_sex_info
  40. else
  41. log::err "性别只能输入男或女!请重新输入正确的性别值(男/女)。"
  42. sex_i='' #错误后初始化性别值
  43. input_sex
  44. fi
  45. }
  46.  
  47. #获取姓名信息函数
  48. input_name(){
  49. read -p "--请输入你的姓名:" your_name
  50. if [ ! ${your_name} ];then
  51. log::err "姓名不能为空!"
  52. input_name
  53. fi
  54. }
  55.  
  56. #获取生日信息函数
  57. input_birthday(){ #获取生日信息函数
  58. read -p "--请输入你的生日(yyyymmdd):" birthday
  59. if [ ! ${birthday} ];then
  60. log::err "生日不能为空!"
  61. input_birthday
  62. fi
  63.  
  64. if ` echo "${birthday}" | grep -P '^\d{8}$' &> /dev/null `;then
  65. log::info "生日格式正确!" > /dev/null
  66. else
  67. log::err "生日格式错误!请重新输入正确的出生日期(yyyymmdd)。"
  68. unset birthday #错误后初始化出生日期值
  69. input_birthday
  70. fi
  71. }
  72.  
  73. #生成校验码
  74. gener_check_number(){
  75. #id_card_n_1变量来至input_info函数
  76. #获取身份证每一位的值
  77. for i in `seq 0 16`
  78. do
  79. let id_$i=`echo ${id_card_n_1:i:1}`
  80. done
  81. let id_sum=${id_0}*7+${id_1}*9+${id_2}*10+${id_3}*5+${id_4}*8+${id_5}*4+${id_6}*2+${id_7}*1+${id_8}*6+${id_9}*3+${id_10}*7+${id_11}*9+${id_12}*10+${id_13}*5+${id_14}*8+${id_15}*4+${id_16}*2
  82. let id_surplus=${id_sum}%11
  83. #echo "和为: $id_sum"
  84. #echo "余为: $id_surplus"
  85. #定义校验位字典
  86. check_n=(
  87. [0]="1" \
  88. [1]="0" \
  89. [2]="x" \
  90. [3]="9" \
  91. [4]="8" \
  92. [5]="7" \
  93. [6]="6" \
  94. [7]="5" \
  95. [8]="4" \
  96. [9]="3" \
  97. [10]="2")
  98.  
  99. check_number_last=${check_n[$id_surplus]}
  100. }
  101.  
  102. #生成性别信息,男性为奇数,女性为偶数
  103. gener_sex_info(){
  104. woman=(0 2 4 6 8)
  105. man=(1 3 5 7 9)
  106. ii=$((RANDOM%5))
  107. [ ${sex_i} == '男' ] && sex_info=${man[$ii]}
  108. [ ${sex_i} == '女' ] && sex_info=${woman[$ii]}
  109. }
  110.  
  111. #生成随机的两位数代替 派出所代码
  112. gener_police_number(){
  113. first_n=$((RANDOM%10))
  114. last_n=$((RANDOM%5))
  115. police_n=${first_n}${last_n}
  116. #echo "${police_n}"
  117. }
  118.  
  119. #整合生成身份证的关键信息函数
  120. input_info(){
  121. input_name #调用获取姓名函数
  122. input_sex #调用获取性别函数
  123. input_birthday #调用获取生日函数
  124. local_number=`bash sub_choice_province.sh` #调用子脚本获取到区域号
  125. gener_police_number #生成代替派出所号的函数
  126. id_card_n_1=${local_number}${birthday}${police_n}${sex_info}
  127. gener_check_number #生成身份证校验码
  128. printf "\n\033[32m--------------生成信息--------------\e[0m\n"
  129. echo -ne "\e[33m"
  130. printf " %-15s %-20s %-21s %-30s\n" 姓名 性别 生日 身份证号
  131. echo -ne "\e[m"
  132. printf " %-15s %-20s %-21s %-30s\n" ${your_name} ${sex_i} ${birthday} ${id_card_n_1}${check_number_last}
  133. }
  134.  
  135. #定义主函数
  136. main(){
  137. display_version #展示程序版本及提示信息
  138. input_info #获取用户输入的信息
  139. #display_resulet #展示最后结果
  140. }
  141.  
  142. #调用主函数
  143. main

子程序主体

  1. [root@135 61_id_card_generation]# cat sub_choice_province.sh
  2. #!/bin/bash
  3. #该脚本作用是省份脚本
  4. select xx in `cat config/provic.txt`
  5. do
  6. #echo "你选择的省份是:$xx"
  7. #echo "选择城市"
  8.  
  9. #选择城市
  10. select city in `cat config/place_name/${xx}.info | awk /....00/'{print $2}'|uniq `
  11. do
  12. #echo "你选择的城市是:$city"
  13. #echo "选择区县"
  14.  
  15. #选择区县
  16. select county in `cat config/place_name/${xx}.info | grep -i $city |awk '{print $3}'|uniq `
  17. do
  18. local_number=`cat config/city_list.info|grep "$city $county"|awk '{print $1}'`
  19. #echo "你选择的区县是:$county"
  20. #echo "完成"
  21. #echo "你选择的省份是:$xx"
  22. #echo "你选择的城市是:$city"
  23. #echo "你选择的区县是:$county"
  24. #echo "对应的地区号位:$local_number"
  25. echo "$local_number"
  26. exit
  27. done
  28. done
  29. done

结果展示

 性别输入错误:

出生日期输入错误:

选择直辖市:

选择非直辖市:

该程序仅限于学习使用!请勿挪作它用!切勿用于非法用途!非法使用造成的一切后果由自己承担,与本作者无关。

shell脚本创建身份证号的更多相关文章

  1. Linux下通过shell脚本创建账户

    当我们在linux平台上开发一些项目时,或者有一些项目是需要部署到linux系统上时,有时候会涉及到linux上的特定的账户,例如有一些项目需要运行在某些特定的账户下,或者有时候需要在全新的环境上搭建 ...

  2. Linux编程 20 shell编程(shell脚本创建,echo显示信息)

    一概述 前面19章里已经掌握了linux系统和命令行的基础知识,从本章开始继续学习shell脚本的基础知识.在大量编辑shell脚本前,先来学习下一些基本概念. 1.1    使用多个命令 Shell ...

  3. shell脚本创建和执行

    shell脚本并不能作为正式的编程语言,因为它是在Linux的shell中运行的,所以称他为shell脚本. 事实上,shell脚本就是一些命令的集合. 我们不妨吧所有的操作都记录到一个文档中,然后去 ...

  4. js脚本根据身份证号获取性别、年龄、家庭地址、生日

    做项目测试时需要根据身份证号获取其信息,也不想调接口,就自己在本地通过收集资料整合了一个

  5. Shell脚本创建的文件夹末尾有两个问号怎么回事?

    原因:Linux系统的换行符是"\r\n",Windows上的换行符是"\n",Windows上编写shell脚本上传Linux,Linux无法正确识别&quo ...

  6. Linux下Shell脚本字符串单引号、双引号、反引号、反斜杠的作用和区别

    一.单引号 str='this is a string' 单引号字符串的限制: 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的: 单引号字串中不能出现单引号(对单引号使用转义符后也不行) ...

  7. Shell脚本创建Nginx的upstream及location配置文件

    #!/bin/sh ##################################################### # Name: create_nginx_conf.sh # Versi ...

  8. 用shell脚本创建sqlite表并添加sql语句--通用

    重要使用的是EOF的功能,亲测和!功能一致:下面是测试代码 #!/bin/bash val=`ls`for v in ${val} do if [ ${v} == "test.db" ...

  9. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

随机推荐

  1. 经典面试题:分布式缓存热点KEY问题如何解决--有赞方案

    有赞透明多级缓存解决方案(TMC) 一.引子 1-1. TMC 是什么 TMC ,即"透明多级缓存( Transparent Multilevel Cache )",是有赞 Paa ...

  2. K8s QoS Pod资源服务质量控制

    Kubernetes 中如果一个 Node 节点上的 Pod 占用资源过多并且不断飙升导致 Node 节点资源不足,可能会导致为了保证节点可用,将容器被杀掉.在遇见这种情况时候,我们希望先杀掉那些不太 ...

  3. python32day

    内容回顾 操作系统的历史 多道操作系统 分时操作系统 实时操作系统 进程 线程 并行和并发 同步和异步 阻塞和非阻塞 今日内容 进程的三状态图 进程的调度算法 给所有进程分配资源或者分配CPU使用权的 ...

  4. 微服务架构 | 5.4 Sentinel 流控、统计和熔断的源码分析

    目录 前言 1. Sentinel 的自动装配 1.2 依赖引入 1.3 SentinelWebAutoConfiguration 配置类 1.4 CommonFilter 过滤器 1.5 小结 2. ...

  5. python 小兵(7)迭代器

    阅读目录 函数名的使用以及第一类对象 闭包 迭代器 回到顶部 函数名的使用以及第一类对象 函数名的运用 函数名是一个变量, 但它是一个特殊的变量, 与括号配合可以执行函数的变量 1.函数名的内存地址 ...

  6. maven 中的工程依赖和层级依赖?

    一.什么是工程依赖? 思考问题?1.1一旦开始分模块开发的时候,之前的所有包都会被拆分成一个一个的项目 model mapper service ... 其实mapper需要model的支持,怎么解决 ...

  7. 如何在pyqt中实现带动画的动态QMenu

    弹出菜单的视觉效果 QLineEdit 原生的菜单弹出效果十分生硬,而且样式很丑.所以照着Groove中单行输入框弹出菜单的样式和动画效果写了一个可以实现动态变化Item的弹出菜单,根据剪贴板的内容是 ...

  8. js表达式和语句

    表达式 一个表达式可以产生一个值,有可能是运算.函数调用.有可能是字面量.表达式可以放在任何需要值的地方. 语句 语句可以理解为一个行为,循环语句和判断语句就是典型的语句.一个程序有很多个语句组成,一 ...

  9. Java用n种方法编写实现双色球随机摇号案例

    方法清单 规则 实现方式一 实现方式二 实现方式三 实现方式四 实现方法五 之前我用JavaScript编写过一个实现双色球随机摇号的案例, 点击此处查看,今天我再用Java语言来实现这一效果. 规则 ...

  10. Pandas之groupby分组

    释义 groupby用来分组,调用groupby 之后返回pandas.core.groupby.generic.DataFrameGroupBy,其实就是由一个个格式为(key, 分组后的dataf ...