Shell脚本练习

news2024/11/20 12:36:19
  • 求100以内正奇数和 

        注意点:

  1. $[]和$(()):是进行数学运算的。支持+ - * / %:分别为 “加、减、乘、除、取模”。但是注意,bash只能作整数运算,对于浮点数是当作字符串处理的。
  2. {a..b}:表示范围。大于等于a,小于等于b。

  •  打印9*9乘法表

        注意点:

  1. echo -n:echo不带参数会自动换行,加-n不会换行。
  2. echo -e:支持转义字符。

         注意点:

  1. $()和``(反引号):表示命令替换。将对反引号或$()里的内容先进行执行,然后将执行的结果代换到当前命令中。
    1. 在多层次的复合替换中,` `必须要额外的转义字符处理(反斜线),而$( )比较直观。
    2. $( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。
    3. seq命令:功能是输出序列化的一串整数。详细介绍:Linux--seq命令_linux seq_一只小菜鸡1111的博客-CSDN博客

  •  随机生成一个10以内的数字,然后写一个猜数字的游戏,若输入的值比随机的值大,则提示大,再输入,若小,则提示小,若相等则提示win。

         注意点:

  1. RANDOM:是Bash中用来生成0~32767之间随机整数的一个内置函数。非常量。
  2. read命令:从标准输入中读取一行,并把输入行的每个字段的值指定给shell变量。 

        参数:

       -a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分隔符。  

       -d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。

  -p 后面跟提示信息,即在输入前打印提示信息。

  -e 在输入的时候可以使用命令补全功能。

  -n 后跟一个数字,定义输入文本的长度,很实用。

  -r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话\就是个正常的字符了。

  -s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。

  -t 后面跟秒数,定义输入字符的等待时间。

  -u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。

        说明:

  read内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。

编写一个创建用户的脚本,要求以下功能
a.提示用户输入希望创建的用户名(当用户超时8秒不输入,提示超时并退出)
b.检测用户名是否已存在,若用户不存在,则进入第c步骤,若用户存在则提示用户是否要对该用户设置密码,若用户输入yes、YES、y、Y时则跳至d步骤,如输入其他,或超时8秒均退出。
c.用户创建完成后提示用户是否要继续设置密码,若用户输入yes、YES、y、Y时则继续下一步,如输入其他,或超时8秒均退出。
d.接上一步,为用户设置密码,首先提示用户输入要设置的密码,密码的输入过程不可见。
e.对用户上一步所输入的密码进行长度检测,若少于5位(包含5位),则提示用户密码太短,请重新输入。
f.对用户在第d步所输入的密码进行复杂度检测,若所输入的内容与/usr/share/dict/words 字典中的某一行条目完全一致,则提示密码是一个常见单词,请重新输入。若第e/f两步的密码错误次数一共超过3次,则提示错误次数过多,并退出。
g.再一次让用户输入密码,若第二次输入的密码与在第d步输入的不一致,则提示用户两次密码不一致,请重新输入,则跳回至第d步。
h.d至g步骤全部通过后,为用户设置密码后,并提示密码已成功设置。最后正确退出。
以上的所有退出情况应给出不同的返回值。

        注意点:

  • linux设置用户和密码:添加用户使用命令:adduser + 用户名,设置密码使用命令:passwd + 用户名,回车后,会需要输入旧密码和新密码,输入的密码不会回显。另一种设置密码的方法:passwd --stdin 用户名,从标准输入中获取新密码,echo 新密码 | passwd --stdin 用户名。弊端是使用history命令可以查看到密码。
  • read -t: 后面跟秒数,定义输入字符的等待时间。超时返回142错误码。

  • read换行:利用-p选项,输出文本,在文本中利用``或者$(),命令替换使用echo -e "文本",支持转义。

  •  id命令:命令会显示用户的 UID(User ID)、GID(Group ID)以及附属于用户的所有组 ID。可以用来查看用户是否存在。
  • &>和>区别:>:输出重定向,将'>'左边的输出的结果重定向到右边,如果是文件,还会覆盖原来的内容。&>:也是输出重定向,不仅会将正确信息输出重定向到右边,还会将错误信息重定向。
  • /dev/null:是一个空设备文件,对于写入会统统丢掉。我们可以通过把命令的输出重定向到 /dev/null 来丢弃脚本的全部输出。cat 去读取这个文件,那么它只会返回文件终点(EOF: end of file)。
  • wc命令:用于统计输入的字节,字符,字数和行数。
    • -c:统计字节数
    • -l:统计行数
    • -m:统计字符数
    • -w:统计字数
    • -L:打印最长行的长度
  • shell中字符串比较

                str1 = str2 : 相等比较

                str1 != str2 : 不等比较

                str1 < str2 : str1小于str2为true,比较字母在字母表顺序,字母越靠后就越大,反之越小

                str1 > str2 : str1大于str2为true,比较字母在字母表顺序,字母越靠后就越大,反之越小

                -n str1 : str1长度不是0则为true

                -z str1 : str1长度为0则为true,-z 是Zero简写

编写一个录入个人信息的脚本/root/bin/information.sh,要求如下:
1.提示用户输入username(需对名字进行字符要求检查,用户名中不能模糊包含系统中任何一个已在存在用户名,如不能为helloroot1,123bin,ggntp2等。且要求username要以大写字母开头,长度至少5个字符。
2.提示用户输入性别,仅能输入male或female,输入其他的提示用户重试。
3.提示用户输入生日,格式必须为yyyy-mm-dd,并对日期的合法性进行检查,若输入2018-02-30等与现实不符的日期,则提示日期错误,请重试。
4.提示用户输入手机号,长度仅能11位,且务必以13x,18x,15x,17x开头,若错误则提示用户重新输入。

5.提示用户输入身份证号,长度可为18位,格式前17位均为数字。要求第7位至第14位所填的内容与第3步的生日符合。同时要求第17位所填的数字若为奇数,那么第2位所填写的性别应为male,反之偶数应为female。最后1位可为数字或x。

6.将以上输入的信息以:为分隔符,保存至/root/info.txt中,每次输入一个用户,会向下追加一行。

如Zhangsan:male:1999-12-20:13588291219:4101011999122030051

注意点:

  • egrep:
    • ^:行首
    • $:行尾
    • 条件:[[:upper:]]表示大写,[ ]:范围内的任意单个字符。[^ ]:范围外的任意单个字符。[a-b]:字符需要在a-b之间,包含a,b。
    • {m, }:表示至少m个字符。
    • {m}:匹配m次即长度为m的字符。
    • {m, n}:至少m次,至多n次
    • {0,n}:匹配至多n次至少0次
#!/bin/bash                                                                                                                                                                              
 
read -p "please enter your name# " user_name
    
for i in `cat /etc/passwd | cut -d: -f1`
do  
  echo $i | grep $user_name &>/dev/null
  if [ $? -eq 0 ];then
    echo -e "用户名中不能模糊包含系统中任何一个已在存在用户名, $i, $user_name\n"
    exit
  fi 
done

echo $user_name | egrep "^[[:upper:]].{4,}" &> /dev/null
if [ $? -ne 0 ];then
  echo -e "要以大写字母开头,长度至少5个字符\n"
  exit 
fi

while true
do
  read -p "please enter gender# " user_gender
  case $user_gender in 
    male|female)
      break
      ;;
    *)
      echo -e "please enter male or female, try again\n"
      continue                        
      ;;   
  esac  
done 

while true 
do     
  read -p "please enter birthday# " user_birthday
  year=`echo $user_birthday | cut -d- -f1`
  month=`echo $user_birthday | cut -d- -f2`
  day=`echo $user_birthday | cut -d- -f3`
               
  cal $day $month $year &> /dev/null
  if [ $? -ne 0 ];then
    echo -e "日期错误,请重试\n"
    continue
  fi
  break              
done 

while true 
do 
  read -p "please entar telphone number# " user_tel
  echo $user_tel | egrep "^1[3857][0-9]{9}" &> /dev/null
  if [ $? -ne 0 ];then 
    echo -e "电话号码错误 重新输入\n"
    continue 
  fi
  break
done 

while true 
do
  read -p "please enter user id card# " user_id 
  echo $user_id | egrep "^[0-9]{17}[0-9x]" &>/dev/null 
  if [ $? -ne 0 ];then 
    echo -e "身份证号错误 重新输入\n"
    continue 
  fi

  usr_year=`echo $user_id | cut -c 7-10`
  usr_month=`echo $user_id | cut -c 11-12`
  usr_day=`echo $user_id | cut -c 13-14`
  if [ $year=$usr_year -a $month=$usr_month -a $day=$usr_day ];then 
    echo -e "身份证号输入成功\n"
  else
    echo -e "身份证号错误 重新输入,生日不符 $year, $month, $day, $usr_year, $usr_month, $usr_day\n"
    continue 
  fi

  usr_sex=`echo $user_id | cut -c 17`
  if [ $(($usr_sex%2)) -eq 0 ];then 
    if [ $user_gender="female" ];then 
      break
    else
      echo -e "身份证号错误 重新输入,性别不符 $user_gender\n"
      continue
    fi
  else 
    if [ $user_gender="male" ];then
      break
    else
      echo -e "身份证号错误 重新输入,性别不符 $user_gender\n"
      continue                                                                                                                                                                           
    fi
  fi
done

ls $(pwd)/info.txt &>/dev/null
if [ $? -ne 0 ];then 
   touch $(pwd)/info.txt
fi
 
echo "$user_name:$user_gender:$user_birthday:$user_tel:$user_id" >> $(pwd)/info.txt

利用上面的脚本,输入20个用户信息。
编写一个抽奖系统的脚本 ,可对/root/info.txt文件中的手机号进行随机抽奖,将中奖的手机号打印出来,要求第4-7位显示为*,即135****1219

注意点:

  • sed命令:
    • -r选项表示:支持扩展正则表达式
    • s/rule/dst/:将输入行的字符串,通过rule正则表达式规则得到的字符串,替换成dst。
    • ():将符合括号里规则的字符串保存到\1和\2...中
    • .*:所有字符串
#!/bin/bash 

rand_i=$((RANDOM%1+1))                                                                                                                                                                   

sed -n "${rand_i} p" $(pwd)/info.txt | cut -d: -f4 | sed -r "s/(^[[:digit:]]{3}).*([[:digit:]]{4}$)/\1****\2/"

 

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

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

相关文章

python3+requests接口自动化测试实例详细操作

前段时间由于公司测试方向的转型&#xff0c;由原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行的接口测试&#xff0c;后来&#xff0c;组内有人讲原先web自动化的测试框架移驾成接口的自动化框架&#xff0c;使用的…

什么是ERP?电商ERP和传统ERP到底有什么不同?

随着电子商务行业的不断发展&#xff0c;传统的ERP系统已经不再适应电商的业务需求&#xff0c;因为这些系统主要是设计用于传统制造和物流公司。 电商企业面临的业务需求与传统制造和物流公司截然不同&#xff0c;因此需要更加灵活和适应性强的解决方案来支持其日常运营。 对…

PointNetGPD代码复现

0、安装分析 Ubuntu版本pcl版本vtk版本18.041.918.2.0 1、pcl1.9安装 1.1 安装依赖 sudo apt-get update sudo apt-get install git build-essential linux-libc-dev sudo apt-get install cmake cmake-gui sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-de…

托福高频真词List04 // 9:40~10:30 |阅读真题 // 11:00~11:50

目录 ​​​​​​​生词 熟词 阅读真题​​​​​​​ inclement adj.天气恶劣的&#xff1b;气候严酷的&#xff1b;狂风暴雨的&#xff1b;潮湿的&#xff1b;寒冷的 ​​​​​​​生词 propertycharacteristicfeaturen 特征substantiallysignificantlylargely…

一文读懂Web Component

前言 由于最近作者在学习微前端&#xff0c;web component也是其中一大特性&#xff0c;部分微前端框架使用到&#xff0c;也是深入学习了一下相关的知识&#xff0c;分享出来。 Web Component是什么&#xff1f; Web Component 实际上一系列技术的组合&#xff0c;主要包含…

【Java】Enum 枚举

java 中的枚举类型本质是默认继承于 java.lang.Enum 的类 常用方法 方法签名描述values()以数组形式返回枚举类型的所有成员ordinal()获取枚举成员的索引位置&#xff08;编号、序号&#xff09;valueOf()将普通字符串转换为枚举实例compareTo()比较两个枚举成员在定义是的顺…

名称空间(namespaces)与作用域

引入 在python解释器中运行一行代码import this就可以看到“传说”中的python之禅&#xff0c;它体现了使用python进行开发的规范&#xff0c;而最后一句 - Namespaces are one honking great idea -- lets do more of those!就是本文的主角。 名称空间(Namespaces) 名称空间…

PointNet:利用深度学习对点云进行3D分类和语义分割

PointNet&#xff1a;利用深度学习对点云进行3D分类和语义分割 参考自&#xff0c;PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation 代码仓库地址为&#xff1a;https://github.com/charlesq34/pointnet/ 介绍 这次介绍的是一个比较基础的工作…

部署博客系统(部署博客系统到云服务器)

目录 1、建库建表 2、微调本地代码 3、打包&#xff08;使用Maven打成war包&#xff09; 4、拷贝到Tomcat的webapps 5、启动Tomcat服务器&#xff08;只有启动成功了才能进行访问&#xff09; 6、访问博客系统 1、建库建表 云服务器访问的是云服务器上的数据库,不是…

FFmpeg YUV 编码 H264

1. x264 库 由于 FFmpeg 不支持 h264 编码,所以需要集成 x264 库,现在使用的是当前最新版本 1.1 官方下载地址: videolanhttps://www.videolan.org/developers/x264.html 1.2 编译脚本地址: x264-ioshttps://github.com/kewlbear/x264-

【信息系统项目管理师】概要和框架-2023年5月7日总结

还有20天考试&#xff0c;记录下这二十天的学习内容。 今天之前4月4日到4月13日五天修炼看了一半&#xff0c;看到了项目风险管理&#xff0c;云里雾里看了个大概。 听野人老师的课从第一章跟着到了第十章&#xff0c;听一会儿就走神&#xff0c;听一会儿就走神。 改变思路&…

1.4 初探Spring - 采用Java配置类管理Bean

一、采用Java配置类管理Bean 1、打开项目 Maven项目 - SpringDemo 2、创建子包 在net.hf.spring包里创建day04子包 3、创建杀龙任务类 在day04子包里创建杀龙任务类 - SlayDragonQuest package net.hf.spring.day04;/*** 功能&#xff1a;杀龙任务类* 作者&#xff1…

Ubuntu搭建VPN服务

PPTD协议 此协议据说安全级别不高&#xff0c;苹果系统已经不支持&#xff0c;但windows依然支持 1.安装,root账号登录服务器 apt-get update apt-get install pptpd 2.配置主机ip及连接主机的设备所分配ip池,客户端分配的内网ip段。 vim /etc/pptpd.conf 将以下两行注释去…

同云跨可用区备份容灾解决方案详解

云可用区 云可用区&#xff08;Availability Zone,AZ&#xff09;是一个可用区是一个或多个物理数据中心的集合&#xff0c;有独立的风火水电&#xff0c;可用区内逻辑上再将计算、网络、存储等资源划分成多个集群。一个地域中的多个可用区间通过高速光纤相连&#xff0c;以满足…

Ubuntu安装Mininet和Ryu出现的问题

问题1-Ryu: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host‘pypi.org’, port443): 解决&#xff1a; pip install XXX -i http://pypi.douban.com/simple --trusted-host pypi.douban.com或 pip install XXX -i http://mirrors.aliyun.c…

国内首个BIM全生命周期装配式建筑项目,建设仅用25周

hi大家好&#xff0c;这里是建模助手。 文章开头我想先问问各位&#xff0c;在你眼中&#xff0c;25周能干点什么&#xff01;小编和你说&#xff0c;在建筑行业里的25周&#xff0c;可以完成一整个保障房项目的建设。 我没开玩笑... 4月16日下午&#xff0c;随着最后一个混凝土…

信号与槽机制

一、信号与槽 1、什么是信号与槽&#xff1f; 信号和槽是用于对象之间的通信&#xff0c;它是Qt的核心机制&#xff0c;在Qt编程中有着广泛的应用。如果想学好Qt&#xff0c;一定要充分掌握信号的槽的概念与使用。 2、信号和槽的代码实例 在Qt中&#xff0c;发送对象、发送的信…

美国纽扣电池的包装电池盒必须附带警告标签16 CFR 第 1700.20

美国纽扣电池及硬币电池的包装、电池盒必须附带警告标签16 CFR 第 1700.20 美国要求在纽扣电池或硬币电池的包装上、电池盒上以及包含纽扣电池或硬币电池的消费品附带说明和手册上贴上警告标签。 商品法规、标准和要求纽扣电池和硬币电池以下所有项&#xff1a; 16 CFR 第 17…

虚幻引擎配置物体水面浮力的简便方法

虚幻引擎配置物体水面浮力的简便方法 目录 虚幻引擎配置物体水面浮力的简便方法前言前期工作配置水面浮力针对一个立方体的水面浮力配置针对船3D模型的水面浮力配置 小结 前言 在使用虚幻引擎配置导入的3D模型时&#xff0c;如何快速地将水面浮力配置正确&#xff0c;从而使得…

快速原型设计工具(Axure)的简单使用

1.运行 安装好后运行&#xff0c;可以看到欢迎界面(不想每次启动都弹出这个的话建议勾选启动时不显示) ​ 这就是Axure的主要界面了&#xff0c;能成功进到这里就说明安装成功&#xff01; 2.Axure主要界面 3.展示形式 通过Axure这个软件生成和打开的文件的后缀名是 .rp&#x…