当前位置: 首页 > news >正文

06-验证浮点数输入

鉴于shell脚本的限制和本事,浮点数(或“实数”)的验证过程乍一看似乎让人望而生畏,不过考虑到浮点数只不过是由小数点分隔的两个整数,再配合能够在脚本中引用其他脚本的能力(validint),你就会发现浮点数验证的代码长度出奇地短。

程序代码
#!/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
}
#!/bin/bash
# validfloat -- 测试数字是否为有效的浮点数
# 注意:该脚本不支持科学计数法(1.304e5)# 要测试输入的值是否为有效的浮点数,需要将值分为两个部分:整数部分和小数部分。
# 先测试第一部分是否为有效整数,然后测试第二部分是否为大于或等于0的有效整数。
# 因此 -30.-8则无效。# 使用“.”记法可以将另一个脚本包含到此脚本中:
#source /root/validint
. /root/validintvalidfloat() {fvalue="$1"# 检查输入的数字是否为有小数点if [ ! -z $(echo $fvalue | sed 's/[^.]//g') ];then# 提取小数点之前的部分decimalPart="$(echo $fvalue | cut -d. -f1)"# 提取小数点之后的部分fractionalPart="${fvalue#*\.}"# 先测试小数点左侧的整数部分。if [ ! -z $decimalPart ];then# 由于“!” 会颠倒测试逻辑,因此下面表示“如果不是有效的整数”。if ! validint "$decimalPart" "" "" ; thenreturn 1fifi# 现在测试小数部分# 小数点之后不能有负号(例如33.-11就不正确),因此先来测试负号if [ "${fractionalPart%${fractionPart#?}}" = "-" ];thenecho "Invalid floating-point number: '-' not allowed after decimal point." >&2return 1 fiif [ "$fractionalPart" != "" ];then# 如果小数部分不是有效的整数.....if ! validint "$fractionalPart" "0" "";thenreturn 1fifielse# 如果整个值只是一个“-”,那也不行if  [ "$fvalue" = "-" ];thenecho "Invalid floating-point format." >&2return 1fi# 最后,检查剩下的部分是否为有效的整数if ! validint "$fvalue" "" "" ; thenreturn 1fifireturn 0
}if validfloat $1 ; thenecho "$1 is a valid floating-point value."
fi
exit 0

工作原理

脚本首先检查输入值是否包含小数点。如果没有,那么说明不是浮点数。接下来,将输入值的整数部分和小数部分分开测试。然后在脚本检查整数部分(小数点左侧)是否有效。之后的代码就比较复杂了,因为我们需要检查有没有多余的负号(避免出现17-30这种情况),另外还要确保小数部分(小数点右侧)也是有效的整数。

最后检查用户指定的是否只是一个负号和小数点(得承认这确实挺怪异)。

如果都没有问题,脚本返回0,表示用户输入的是一个有效的浮点数。

精益求精

一个比较酷的改进是让这个函数能够处理最后一个例子中出现的科学记数法。这算不上多难,你可以先测试是否存在'e'或'E',然后将值分成3部分:整数部分(只有一个数字)、小数部分以及10的幂。剩下的事情就是确保每部分都是有效的整数。

相关文章:

06-验证浮点数输入

鉴于shell脚本的限制和本事,浮点数(或“实数”)的验证过程乍一看似乎让人望而生畏,不过考虑到浮点数只不过是由小数点分隔的两个整数,再配合能够在脚本中引用其他脚本的能力(validint)&#xff…...

shell实现查询进程号并批量kill(脚本)

问题或需求描述 在shell中,如果你想通过命令行查询出一系列匹配某个关键词的进程,并使用xargs命令批量结束这些进程,可以按照以下步骤操作: # 查询并提取进程号 pgrep -f "关键词" | xargs kill# 或者,如果…...

【软考】蠕虫病毒

目录 一、概念1.1 说明 二、示例2.1 震网2.2 熊猫烧香2.2 红色代码2.3 爱虫病毒 一、概念 1.1 说明 1.一段可以借助程序自行传播的程序或代码 二、示例 2.1 震网 1.Stuxnet 2.利用系统漏洞破坏工业基础设施,攻击工业控制系统 2.2 熊猫烧香 1.是一种经过多次变种…...

大模型知识点汇总——分布式训练

PS:本篇只在宏观上介绍相关概念和技术,不做数学推导和过于细节介绍,旨在快速有一个宏观认知,不拘泥在细节上,导致很混乱。 涉及技术名词 分布式框架等涉及的技术名词很多,很容易让人眼花缭乱,…...

java之网络编程

网络编程之TCP/IP协议 网络编程分为两个不同的层次:一是基于Socket的低层次网络编程,二是基于URL的高层次网络编程 高低层次就是通信协议的高低层次,Socket采用TCP、UDP等协议,这些协议属于低层次的通信协议;URL采用H…...

【Linux】Centos7安装redis

目录 下载安装包安装1.解压2.环境安装3.查看redis的安装路径4.将之前redis的配置文件,复制到安装路径下(新建一个文件夹并复制)5.redis 设置默认后台启动,修改配置文件6.启动redis服务默认启动通过配置文件启动查看进程 7.开放637…...

蓝桥杯(2):python基础算法【上】

时间复杂度、枚举、模拟、递归、进制转换、前缀和、差分、离散化 1 时间复杂度 重要是看循环,一共运行了几次 1.1 简单代码看循环 #时间复杂度1 n int(input()) for i in range(1,n1):for j in range(0,i):pass ###时间复杂度:123....nn(1n)/2 所以…...

一个js正则,轻松去除字符串里的\n\t空格

推荐一款AI网站,免费使用GPT3.5,戳此入👇:AI写作 在Node.js中,如果你想要从字符串中全局去除换行符(\n)、制表符(\t)和空格,你可以使用正则表达式与String.prototype.replace()方法结合使用。下面是一个简…...

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(四)—— 过拟合和欠拟合

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: Tensorflow与Keras实战演绎 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 通过增加容量或提前停止来提高性能。 在深度学习中&…...

RuoYi-Vue若依框架-代码生成器的使用

代码生成器 导入表 在系统工具内找到代码生成,点击导入,会显示数据库内未被导入的数据库表单,选择自己需要生成代码的表,友情提醒,第一次使用最好先导入一张表进行试水~ 预览 操作成功后可以点击预览查看效果&…...

AI PPT生成工具 V1.0.0

AI PPT是一款高效快速的PPT生成工具,能够一键生成符合相关主题的PPT文件,大大提高工作效率。生成的PPT内容专业、细致、实用。 软件特点 免费无广告,简单易用,快速高效,提高工作效率 一键生成相关主题的标题、大纲、…...

进程和线程,线程实现的几种基本方法

什么是进程? 我们这里学习进程是为了后面的线程做铺垫的。 一个程序运行起来,在操作系统中,就会出现对应的进程。简单的来说,一个进程就是跑起来的应用程序。 在电脑上我们可以通过任务管理器可以看到,跑起来的应用程…...

【PyTorch】解决PyTorch安装中torch.cuda.is_available()返回False的问题

最近在安装PyTorch时遇到torch.cuda.is_available() False的问题,特此记录下解决方法,以帮助其他遇到相同问题的人。 问题描述 Ubuntu 20.04,3060 Laptop,安装了CUDA 11.4,在Anaconda下新建了Python 3.8的环境&…...

95% 的公司面临 API 安全问题

API 对企业安全发挥着关键作用,但绝大多数企业都为此遭受日益严重的安全风险。据安全公司 Fastly最近做的一项调查显示,84% 的受访企业缺乏足够的API安全措施,95%的企业在过去1年中遇到过 API 安全问题。 此外,79%的受访企业出于A…...

mysql的基本知识点-排序和分组

分组(GROUP BY) GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。例如,假设你有一个包含销售数据的表,并且你想按产品类别计算总销售额。你可以使用 GROUP BY 和 SUM() 函数来实现这一点。 SELECT…...

使用uniapp 的 plus.sqlite 操作本地数据库报错:::table xxx has no column named xxxx

背景: 1、使用uniapp 的 plus.sqlite 进行APP本地数据库操作 2、SQLite 模块用于操作本地数据库文件,可实现数据库文件的创建,执行SQL语句等功能。 遇到:在之前创建的表上进行新增字段的操作时候,出现问题&#xff1a…...

第十五届蓝桥杯模拟赛 第三期 (C++)

第二次做蓝桥模拟赛的博客记录,可能有很多不足的地方,如果大佬有更好的思路或者本文中出现错误,欢迎分享思路或者提出意见 题目A 请问 2023 有多少个约数?即有多少个正整数,使得 2023 是这个正整数的整数倍。 答案&…...

Linux中的常用基础操作

ls 列出当前目录下的子目录和文件 ls -a 列出当前目录下的所有内容(包括以.开头的隐藏文件) ls [目录名] 列出指定目录下的子目录和文件 ls -l 或 ll 以列表的形式列出当前目录下子目录和文件的详细信息 pwd 显示当前所在目录的路径 ctrll 清屏 cd…...

【SpringMVC】知识汇总

SpringMVC 短暂回来,有时间就会更新博客 文章目录 SpringMVC前言一、第一章 SpingMVC概述二、SpringMVC常用注解1. Controller注解2. RequestMapping注解3. ResponseBody注解4. RequestParam5. EnableWebMvc注解介绍6. RequestBody注解介绍7. RequestBody与RequestP…...

android13实现切换导航模式功能

支持android13以上系统,需要系统签名。 public class NavigationHelper {/*** 设置导航模式** param context* param mode GESTURAL:手势 TWOBUTTON:二按钮 THREEBUTTON:三按钮*/public static void setNavigationMode(Contex…...

Jenkins使用手册

前提是Jenkins已经部署好在服务器上了,这个手册适用于Jenkins建一个新项目档案点击New Item创建一个新的项目档案点击ok后进入以下配置页面建议勾选第一个选项 Discard builds其他选项的含义这就是让 Jenkins 知道“去哪里拿代码”的核心关卡。去git还是svn厂库去拉…...

OWL ADVENTURE场景实战:打造你的个人创意图片分析助手

OWL ADVENTURE场景实战:打造你的个人创意图片分析助手 你是否经常遇到这样的情况:看到一张有趣的图片,想知道它背后的故事?或者作为设计师,需要快速分析竞品的视觉风格?又或者只是想找个能"看懂"…...

用LBM格子玻尔兹曼方法在Matlab中模拟3D气泡上升多相流

lbm格子玻尔兹曼方法模拟3D气泡上升多相流 matlab在计算流体力学领域,模拟多相流现象一直是个热门且具有挑战性的话题。今天咱们就来唠唠用格子玻尔兹曼方法(Lattice Boltzmann Method, LBM)在Matlab里模拟3D气泡上升多相流。 LBM方法简介 格…...

OpenClaw调试技巧:解决SecGPT-14B模型返回结果异常问题

OpenClaw调试技巧:解决SecGPT-14B模型返回结果异常问题 1. 问题背景与现象描述 上周在尝试用OpenClaw对接SecGPT-14B模型时,遇到了一个棘手的问题:模型返回的结果经常出现截断或格式混乱。具体表现为: 当请求生成网络安全报告时…...

Changelog.com贡献指南:如何参与这个活跃的开源项目

Changelog.com贡献指南:如何参与这个活跃的开源项目 【免费下载链接】changelog.com Changelog is news and podcast for developers. This is our open source platform. 项目地址: https://gitcode.com/gh_mirrors/ch/changelog.com Changelog.com是一个使…...

OpenClaw安全沙箱:Qwen3-32B镜像的权限隔离实验

OpenClaw安全沙箱:Qwen3-32B镜像的权限隔离实验 1. 为什么需要安全沙箱 当我第一次看到OpenClaw能够直接操作我的电脑文件时,既兴奋又担忧。兴奋的是它能够帮我自动化处理大量重复工作,担忧的是如果AI不小心执行了rm -rf这样的危险命令怎么…...

双模型协作方案:OpenClaw同时接入Phi-3-vision-128k-instruct与Qwen的配置技巧

双模型协作方案:OpenClaw同时接入Phi-3-vision-128k-instruct与Qwen的配置技巧 1. 为什么需要双模型协作? 去年我在搭建个人自动化助手时,发现单一模型很难兼顾所有任务场景。当我尝试用纯文本模型处理截图中的表格数据时,识别准…...

OpenClaw+千问3.5-27B学习助手:自动整理笔记与生成思维导图

OpenClaw千问3.5-27B学习助手:自动整理笔记与生成思维导图 1. 为什么需要AI学习助手? 去年准备技术认证考试时,我发现自己陷入了"资料沼泽"——收集了87个PDF、42小时视频课程和无数网页书签,但真正消化吸收的内容不到…...

Zynq-7000 + RT-Thread + lwIP 实时网络性能调优实战

1. 为什么选择Zynq-7000 RT-Thread lwIP组合 在嵌入式网络应用中,实时性和确定性往往是首要考虑因素。我曾在多个工业控制项目中遇到这样的场景:系统需要同时处理高速UDP数据流和稳定的TCP控制指令,传统的嵌入式Linux方案虽然功能全面&…...

C++的std--ranges中的策略内联编译器

C的std::ranges中的策略内联编译器:高效编程的新利器 在现代C编程中,std::ranges库的引入为算法和范围操作带来了革命性的改进。其中,策略内联编译器作为其核心优化手段之一,能够显著提升代码执行效率。本文将深入探讨这一技术的…...