使用Shell脚本生成身份证号码的方法
最编程
2024-02-04 19:43:10
...
--作者:飞翔的小胖猪
--创建时间:2021年5月16日
--修改时间:2021年5月16日
说明
运行脚本,用户手动输入信息生成身份证号。该程序的核心在于函数模块化及select的使用。
注意:该程序仅限于学习使用!请勿挪作它用!切勿用于非法用途!非法使用造成的一切后果由自己承担,与本作者无关。
文件说明
程序主要有4类文件组成,分为主程序脚本、子程序脚本、省份列表文件、城市列表文件。
id_card_generation.sh:主程序脚本文件
sub_choice_province.sh:子程序脚本文件
config/provic.txt:省级列表文件
config/place_name/${城市}.info:省级下城市名文件
目录展示
├── config │ ├── place_name │ │ ├── 上海市.info │ │ ├── 云南省.info │ │ ├── 内蒙古自治区.info │ │ ├── 北京市.info │ │ ├── *省.info │ │ ├── ........info │ │ ├── ........info │ │ ├── .........info │ │ ├── ...........info │ │ ├── 贵州省.info │ │ ├── 辽宁省.info │ │ ├── 重庆市.info │ │ ├── 陕西省.info │ │ ├── 青海省.info │ │ ├── 香港特别行政区.info │ │ ├── 黑龙江.info │ │ └── 黑龙江省.info │ └── provic.txt ├── id_card_generation.sh └── sub_choice_province.sh
配置文件
注意:出于安全考虑,仅展示配置文件中部分内容。读者可以根据展示的配置文件格式自行完整配置文件格式。
config/provic.txt
[root@135 config]# cat provic.txt 北京市 天津市 河北省 山西省 ........
........
........ **自治区
config/place_name/贵州省.info
[root@135 61_id_card_generation]# cat config/place_name/贵州省.info 520000 贵州省 贵州省 520100 贵阳市 贵阳市 520101 贵阳市 市辖区 520102 贵阳市 南明区 520103 贵阳市 云岩区 520111 贵阳市 花溪区 520112 贵阳市 乌当区 520113 贵阳市 白云区 ...................
...................
...................522722 黔南布依族苗族自治州 荔波县 522723 黔南布依族苗族自治州 贵定县 522725 黔南布依族苗族自治州 瓮安县 522726 黔南布依族苗族自治州 独山县 522727 黔南布依族苗族自治州 平塘县 522728 黔南布依族苗族自治州 罗甸县 522729 黔南布依族苗族自治州 长顺县 522730 黔南布依族苗族自治州 龙里县 522731 黔南布依族苗族自治州 惠水县 522732 黔南布依族苗族自治州 三都水族自治县
主程序主体
[root@135 61_id_card_generation]# cat id_card_generation.sh #!/bin/bash #显示程式版本号及提示信息函数 display_version(){ echo -e '\e[34m##########################################################\e[0m' echo -e '\e[34m## ##\e[0m' echo -e '\e[34m## 身份证生成程式-v.1.0 ##\e[0m' echo -e '\e[34m## ##\e[0m' echo -e '\e[34m##########################################################\e[0m' log::warn "脚本仅作为学习使用,切勿挪作它用!!!!!!!\n" } #定义错误等级的输入格式为红色 log::err() { printf "\033[31m ERROR: \033[0m$@\n" } #定义成功等级的输入格式为绿色 log::info() { printf "\033[32m SUCCESS: \033[0m$@\n" } #定义告警等级的输入格式为黄色 log::warn() { printf "\033[33mWARNING: \033[0m$@\n" } #获取性别信息函数 input_sex(){ read -p "--你的性别:" sex_i if [ ! ${sex_i} ];then log::err "性别不能为空!" input_sex fi if [ ${sex_i} == '男' ] || [ ${sex_i} == '女' ];then log::info "性别输入正常!" > /dev/null gener_sex_info else log::err "性别只能输入男或女!请重新输入正确的性别值(男/女)。" sex_i='' #错误后初始化性别值 input_sex fi } #获取姓名信息函数 input_name(){ read -p "--请输入你的姓名:" your_name if [ ! ${your_name} ];then log::err "姓名不能为空!" input_name fi } #获取生日信息函数 input_birthday(){ #获取生日信息函数 read -p "--请输入你的生日(yyyymmdd):" birthday if [ ! ${birthday} ];then log::err "生日不能为空!" input_birthday fi if ` echo "${birthday}" | grep -P '^\d{8}$' &> /dev/null `;then log::info "生日格式正确!" > /dev/null else log::err "生日格式错误!请重新输入正确的出生日期(yyyymmdd)。" unset birthday #错误后初始化出生日期值 input_birthday fi } #生成校验码 gener_check_number(){ #id_card_n_1变量来至input_info函数 #获取身份证每一位的值 for i in `seq 0 16` do let id_$i=`echo ${id_card_n_1:i:1}` done 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 let id_surplus=${id_sum}%11 #echo "和为: $id_sum" #echo "余为: $id_surplus" #定义校验位字典 check_n=( [0]="1" \ [1]="0" \ [2]="x" \ [3]="9" \ [4]="8" \ [5]="7" \ [6]="6" \ [7]="5" \ [8]="4" \ [9]="3" \ [10]="2") check_number_last=${check_n[$id_surplus]} } #生成性别信息,男性为奇数,女性为偶数 gener_sex_info(){ woman=(0 2 4 6 8) man=(1 3 5 7 9) ii=$((RANDOM%5)) [ ${sex_i} == '男' ] && sex_info=${man[$ii]} [ ${sex_i} == '女' ] && sex_info=${woman[$ii]} } #生成随机的两位数代替 派出所代码 gener_police_number(){ first_n=$((RANDOM%10)) last_n=$((RANDOM%5)) police_n=${first_n}${last_n} #echo "${police_n}" } #整合生成身份证的关键信息函数 input_info(){ input_name #调用获取姓名函数 input_sex #调用获取性别函数 input_birthday #调用获取生日函数 local_number=`bash sub_choice_province.sh` #调用子脚本获取到区域号 gener_police_number #生成代替派出所号的函数 id_card_n_1=${local_number}${birthday}${police_n}${sex_info} gener_check_number #生成身份证校验码 printf "\n\033[32m--------------生成信息--------------\e[0m\n" echo -ne "\e[33m" printf " %-15s %-20s %-21s %-30s\n" 姓名 性别 生日 身份证号 echo -ne "\e[m" printf " %-15s %-20s %-21s %-30s\n" ${your_name} ${sex_i} ${birthday} ${id_card_n_1}${check_number_last} } #定义主函数 main(){ display_version #展示程序版本及提示信息 input_info #获取用户输入的信息 #display_resulet #展示最后结果 } #调用主函数 main
子程序主体
[root@135 61_id_card_generation]# cat sub_choice_province.sh #!/bin/bash #该脚本作用是省份脚本 select xx in `cat config/provic.txt` do #echo "你选择的省份是:$xx" #echo "选择城市" #选择城市 select city in `cat config/place_name/${xx}.info | awk /....00/'{print $2}'|uniq ` do #echo "你选择的城市是:$city" #echo "选择区县" #选择区县 select county in `cat config/place_name/${xx}.info | grep -i $city |awk '{print $3}'|uniq ` do local_number=`cat config/city_list.info|grep "$city $county"|awk '{print $1}'` #echo "你选择的区县是:$county" #echo "完成" #echo "你选择的省份是:$xx" #echo "你选择的城市是:$city" #echo "你选择的区县是:$county" #echo "对应的地区号位:$local_number" echo "$local_number" exit done done done
结果展示
性别输入错误:
出生日期输入错误:
选择直辖市:
选择非直辖市:
该程序仅限于学习使用!请勿挪作它用!切勿用于非法用途!非法使用造成的一切后果由自己承担,与本作者无关。
推荐阅读
-
在 excel 中获取身份证号码,自动生成补充资料的出生日期以及生成年龄的方法
-
使用 "多线程 "在 Shell 中执行脚本文件的完美解决方案
-
使用 Matlab 生成正弦信号并进行采样以获得样本值的方法
-
使用 PHPUnit 进行单元测试和生成代码覆盖率报告的方法
-
Kotlin:为什么要创建不能被继承的类--示例:数据类 PsersonBean 反编译数据类 PsersonBean 生成公共最终类 PsersonBean 示例:类 User 反编译类 User 生成**公共最终类 User** 公共最终类 PsersonBean 其次,有几种方法可以使类具有可继承性 1.用 open 关键字标记类 例:打开类 Shape 的继承 例:类 Circle :形状 2.使用 abstract 将该类声明为抽象类。 示例:抽象类 Car Testabstract.kt 文件代码
-
CAPL 编写 TestCase 的常用函数和使用方法介绍-2.编写 TestCase 脚本
-
Jmeter --- 非 GUI 命令行执行生成报告,使用 ant 插件执行界面测试脚本生成报告 -jmeter -n -t filename.jmx (-n:非 GUI 方式 -t:指定需要执行的脚本) 生成 jtl 报告 运行:jmeter -n -t filename.jmx -l result_filename.jtl
-
Java 类加载器的作用 - 简介:类加载器是 Java™ 中一个非常重要的概念。类加载器负责将 Java 类的字节码加载到 Java 虚拟机中。本文首先详细介绍了 Java 类加载器的基本概念,包括代理模型、加载类的具体过程和线程上下文类加载器等。然后介绍了如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。 类加载器是 Java 语言的一项创新,也是 Java 语言广受欢迎的重要原因之一。它允许将 Java 类动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 开始出现,最初是为了满足 Java Applets 的需求而开发的,Java Applets 需要从远程位置下载 Java 类文件并在浏览器中执行。现在,类加载器已广泛应用于网络容器和 OSGi。一般来说,Java 应用程序的开发人员不需要直接与类加载器交互;Java 虚拟机的默认行为足以应对大多数情况。但是,如果遇到需要与类加载器交互的情况,而您又不太了解类加载器的机制,就很容易花费大量时间调试异常,如 ClassNotFoundException 和 NoClassDefFoundError。本文将详细介绍 Java 的类加载器,帮助读者深入理解 Java 语言中的这一重要概念。下面先介绍一些基本概念。 类加载器的基本概念 顾名思义,类加载器用于将 Java 类加载到 Java 虚拟机中。一般来说,Java 虚拟机以如下方式使用 Java 类:Java 源程序(.java 文件)经 Java 编译器编译后转换为 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码并将其转换为 java.lang 实例。每个实例都用来表示一个 Java 类。通过该实例的 newInstance 方法创建该类的对象。实际情况可能更加复杂,例如,Java 字节代码可能是由工具动态生成或通过网络下载的。 基本上,所有类加载器都是 java.lang.ClassLoader 类的实例。下面将详细介绍这个 Java 类。 java.lang.ClassLoader 类简介 java.lang.ClassLoader 类的基本职责是根据给定类的名称为其查找或生成相应的字节码,然后根据这些字节码定义一个 Java 类,即 java.lang.Class 类的实例。除此之外,ClassLoader 还负责加载 Java 应用程序所需的资源,如图像文件和配置文件。不过,本文只讨论它加载类的功能。为了履行加载类的职责,ClassLoader 提供了许多方法,其中比较重要的方法如表 1 所示。下文将详细介绍这些方法。 表 1.与加载类相关的 ClassLoader 方法
-
手写类加载器演示 自定义加载类 (1) 创建一个新的 java 文件,并将其保存在适当的目录下。 (2) 使用 cmd 命令进入 world class 的父目录,运行 javac 命令生成 .class 文件。 (3) 创建自己定义的 classload 类。 // 继承 ClassLoader 类并覆盖 findclass 方法。 公共类 MyClassloader extends ClassLoader { private String path; private String classloaderName; private ClassLoader; classloaderName. public MyClassloader(String path,String classloaderName){ this. this.classloaderName = classloaderName; public MyClassloader(String path,String classloaderName){ this.path = path; this.classloaderName = classloaderName; this.classloaderName = classloaderName } // 用于查找类文件 @Override public Class findClass(String name){ byte b =loadClassData(name); return defineClass(name,b,0,b.length); } return defineClass(name,b,0,b.length); } public byte loadClassData(String name) { name = path + name + ".class"; } public byte loadClassData(String name) { name = path + name + ".class"; } InputStream in = null; ByteArrayOutputStream out = null; try { in = new FileInputStream(new File(name)); out = new ByteArrayOutputStream out = new ByteArrayOutputStream; int i = 0; out = new ByteArrayOutputStream out = new ByteArrayOutputStream; int i = 0; while ((i = in.read)) while ((i = in.read) != -1){ out.write(i); } } } catch (Exception e) { e.printStackTrace; }finally { out.write(i) 最后 { try { out.close; in.close; }finally { try { out.close; in.close. in.close. } catch (IOException e) { e.printStackTrace; }catch (IOException e) { e.printStackTrace } } return out.toByteArray; } } } (4) 创建一个测试类并测试结果。 公共类 ClassLoderCheck { public static void main(String args) 抛出 IllegalAccessException、InstantiationException、ClassNotFoundException { MyClassloader classloader = new MyClassloader("D:/jvm/", "myclasscloderz"); 类 c = classloader.loadClass("World"); System.out.println(System.out.println) System.out.println(c.getClassLoader); System.out.println(c.getClassLoader.getParent); System.out.println(c.getClassLoader.getParent.getParent); system.out.println(c.getClassLoader.getParent); c.newInstance; } } 运行结果如下 自定义类加载器的作用:jvm 自带的三个加载器只能加载指定路径下的类字节码。如果在某种情况下,我们需要加载类文件之外的应用程序?例如,本地 D 盘,或在网络上加载类文件,这种情况下可以使用自定义加载器。
-
PHP 使用 imagick read PDF 生成 png 缩略图的两种方法