shell脚本创建身份证号

--作者:飞翔的小胖猪

--创建时间: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

结果展示

 性别输入错误:

出生日期输入错误:

选择直辖市:

选择非直辖市:

 

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

 

posted @ 2021-05-16 09:46  飞翔的小胖猪  阅读(547)  评论(0编辑  收藏  举报