05-验证整数输入

需求分析

我们在脚本中验证整数输入可谓是小菜一碟,但如果你也想接受负数的话,可就没那么容易了。问题在于每个数值只能有一个负号,而且还必须出现在数值的最开始部分。下面脚本可以确保正确地格式化负数,另外还能检查其值是否位于用户指定的区间内。

代码实现
#!/bin/sh
#filename:validint
#description:验证整数输入,允许出现负数。validint() {# 验证第一个参数并根据 最小值$2 和/或 最大值$3(如果指定的话)进行测试。# 如果第一个参数的值不在指定区间内或者不全是数字组成,那么脚本执行失败number="$1";    min="$2";       max="$3"# 判断输入是否为空if [ -z $number ]; thenecho "You didn't enter anything. Please enter a number." >&2return 1fi# 获取整数部分if [ "${number%${number#?}}" = "-" ]; then# 获取第一个字符以外的所有字符进行测试testvalue="${number#?}"elsetestvalue="$number"fi# 删除变量number中的所有数字,以作测试之用nodigits="$(echo $testvalue | sed 's/[[:digit:]]//g')"# 检查非数字字符if [ ! -z $nodigits ];thenecho "Invalid number format! Only digits, no commas, spaces, etc." >&2return 1fiif [ ! -z $min ];then# 输入值是否小于指定的最小值?if [ "$number" -lt "$min" ];thenecho "Your value is too small: smallest accpetable value is $min." >&2return 1fifiif [ ! -z $max ];then# 输入值是否大于指定的最大值if [ "$number" -gt "$max" ];thenecho "Your value is too big: largest acceptable value is $max." >&2return 1fifireturn 0
}#------------执行脚本----
# 验证输入
if validint "$1" "$2" "$3" ; thenecho "Input is a valid integer within your constraints."
fi

工作原理

验证整数非常简单,因为值要么是一连串数字(0至9,要么开头部分会有一个仅出现一次的负号。如果在调用validint()函数的时候指定了最小值或最大值(或同时给出了两者),那么它会对其做出检查,以确保输入的值位于区间内。

函数要确保不会出现用户不输入任何参数的情况(也要考虑到这个位置上可能会出现带有引号的空字符串,这一点很重要,以避免产生错误信息)。

然后查找负号,创建不包含任何数字的输入值。如果去除数字后的值长度不为0,说明输入有问题,测试失败

如果输入值有效,将其与指定的最小值和最大值做比较x。最后,如果函数出现错误,返回1;否则,返回0。

精益求精

注意,测试检查用户输入值的第一个字符是否为负号:if [ "${number%${number#?}}" = "-" ] ; then

如果第一个字符是负号,就将整数值的数字部分赋给变量testvalue。然后将其中所有的数字全部剔除,做进一步测试,原代码如下:

if [ ! -z $min ];then# 输入值是否小于指定的最小值?if [ "$number" -lt "$min" ];thenecho "Your value is too small: smallest accpetable value is $min." >&2return 1fi
fi

你可能会想用逻辑AND(-a)连接两个表达式,这样就可以少用一个嵌套if语句了。例如,下面的代码看起来应该没问题:

if [ ! -z $min -a  "$number" -lt "$min" ] ; thenecho "Your value is too small: smallest acceptable value is $min." >&2  exit 1
fi

可惜事与愿违,因为即便AND的第一个条件被证明为假,你也无法保证第二个条件不会被测试(这一点和其他大多数编程语言不同)。这意味着,如果你打算采用这种写法,那么在比较的时候,可能会碰上由于无效或非预期值所造成的各种bug。事情本不该如此,但是是你自己要这么写的。

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

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

相关文章

JAVA工程师面试专题-《并发编程篇》

目录 一、线程 1、并发与并行的区别 2、同步和异步的区别 3、Java中创建线程有哪些方式? 4、Thread和Runnable的区别 5、Java中的Runnable、Callable、Future、FutureTask的区别和联系? 6、说一下你对 CompletableFuture 的理解 7、volatile关键字有什么用&…

Ansible script 模块 该模块用于将本机的脚本在被管理端的机器上运行。Ansible服务执行本机脚本

目录 过程首先,我们写一个脚本,并给其加上执行权限直接运行命令来实现在被管理端执行该脚本验证错误演示 过程 该模块直接指定脚本的路径即可 首先,我们写一个脚本,并给其加上执行权限 vim /tmp/df.sh编辑脚本内容 这个脚本内容…

信钰证券:无任何氢能产品形成收入,这只氢能概念股却八连板了

受氢能方针面影响,多个氢能股迎来连涨潮。 2月26日,蓝科高新(601798.SH)涨停,截至收盘报11.01元,涨幅9.99%,完成八连板,总市值39.03亿元。首要因其地点氢能板块全体上涨影响。 同日同花顺氢动力概念下&am…

【底层解读】ArrayList源码学习

成员变量 学习源码前,我们还是先看一下ArrayList中成员变量有哪些 构造函数 ArrayList一共有三个构造函数。 第一个:带有指定初始容量的构造函数 第二个:空参构造 第三个:包含指定集合的构造函数 OK,看完构造函数&a…

120KW OBC充电机定期检测的必要性

随着电动汽车的普及,充电设备的需求也在不断增加,其中,120KW OBC(On-Board Charger)充电机作为电动汽车的重要充电设备,其性能和安全性直接关系到电动汽车的使用体验和安全。因此,对120KW OBC充…

Python日志记录库——loguru

文章目录 一. 概述二、基本使用2.1 安装2.2 日志输出 三、进阶用法3.1 显示格式3.2 写入文件3.3 模块名参数化3.4 日志留存、压缩与清理3.5 序列化为json格式3.6 并发安全 参考资料 一. 概述 在 Python 中用到日志记录,那就不可避免地会用到内置的 logging标准库 。…

Spring全面精简总结

Spring两大核心功能:IOC控制反转、AOP面向切面的编程 控制反转(loC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是…

雷达一维成像:基于数据集的实践

雷达一维成像:基于数据集的实践 (距离压缩\距离-时间图\距离-多普勒图\微多普勒图) 说明 雷达成像技术是雷达发展的一个重要里程碑:从此雷达的功能不仅仅是将所观测的对象视为点目标,并只测量它的位置与运动参数。雷达成像技术使得我们可以获…

【Linux C | 网络编程】套接字选项、getsockopt、setsockopt详解及C语言例子

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

雾锁王国服务器配置怎么选择?阿里云和腾讯云

雾锁王国/Enshrouded服务器CPU内存配置如何选择?阿里云服务器网aliyunfuwuqi.com建议选择8核32G配置,支持4人玩家畅玩,自带10M公网带宽,1个月90元,3个月271元,幻兽帕鲁服务器申请页面 https://t.aliyun.com…

电商数据api接口大全,商品API,店铺API,订单API,获取请求key详细接入案例

电商数据API接口大全包括商品API、店铺API和订单API等,以下是一些常见的API接口以及获取请求key的详细接入案例: 获取请求key的详细接入案例: 以淘宝商品API为例,获取请求key的步骤如下: 注册成为开放平台的开发者&a…

GB28181 —— Ubuntu20.04下使用ZLMediaKit+WVP搭建GB28181流媒体监控平台(连接带云台摄像机)

最终效果 简介 GB28181协议是视频监控领域的国家标准。该标准规定了公共安全视频监控联网系统的互联结构, 传输、交换、控制的基本要求和安全性要求, 以及控制、传输流程和协议接口等技术要求,是视频监控领域的国家标准。GB28181协议信令层面使用的是SIP(Session Initiatio…

k8s节点负载使用情况分析命令kubectl describe node [node-name]

1.到任意安装了kubectl节点命令的节点上执行kubectl describe node [node-name] 上面的Requests最小分配 Limits最大分配是所有pod之和,最小分配之和不能超过服务器实际参数,否则新的pod会因为资源不够起不来,最大分配是预设之和&#xff0…

程序员眼中的“祖传代码”:魔法书中的智慧和技巧

目录 前言1 祖传代码的传承与传统2 家传宝贝:珍贵的遗产3 祖传秘方:独特的问题解决奥秘4 祖传代码中的故事:技术的发展轨迹结语 前言 在编程的奇妙世界中,存在着一种特殊的代码,被程序员们亲切地称之为“祖传代码”。…

Spring6学习技术|事务

学习材料 尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解) 事务 什么是事务?好像是数据库部分的词,我自己的理解是对数据库进行的操作序列,要么一起完成,要么都不完成…

2024年AI行业专题报告:AI巨轮滚滚向前

2024年AI行业专题报告:AI巨轮滚滚向前。 1 Sora、Gemini 1.5 Pro 相继发布,AIGC 新时代已至 1.1 大模型 Sora 震撼登场,AI 生成视频领域里程碑 OpenAI 在 2024 年 2 月 16 日发布文生视频模型 Sora,突破了 AIGC 的高地&#xff0…

经营分析到底要做什么?

​做经营分析,不是只看数据这么简单,我们要从目标-分析-决策-预警,全流程实现。 基于数据中台底座,实现从制定战略目标到执行落地的数据应用闭环。主要从四个维度来做: 第一步,就是基于预算管理进行战略目…

Python中高效的爬虫框架,你用过几个?

在信息时代,数据是无价之宝。许多开发者和数据分析师需要从互联网上采集大量的数据,用于各种用途,如分析、建模、可视化等。Python作为一门强大的编程语言,提供了多种高效的爬虫框架,使数据采集变得更加容易和高效。本…

【Golang入门教程】Goland常用快捷键,看这一篇就够了 - 副本 (2)

开源软件的影响力 文章目录 开源软件的影响力 强烈推荐前言一、文件操作相关快捷键二、代码格式化相关的快捷键三、查找和定位相关的快捷键四、编辑代码相关的快捷键四、编辑器相关的快捷键总结强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站&…

力扣经典题目解析--搜索二维矩阵(小米一面)

原题地址: . - 力扣(LeetCode) 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中&#xff0c…