测试字符串是否为有效的整数。

18 浏览
0 Comments

测试字符串是否为有效的整数。

我试图做一些很常见的事情:在shell脚本中解析用户输入。如果用户提供了一个有效的整数,脚本会执行一项操作;如果无效,脚本会执行另一项操作。问题是,我还没有找到一种简单(并且相对优雅)的方法来完成这个任务——我不想逐个字符拆分它。

我知道这一定很简单,但我不知道怎么做。我可以用十几种语言来做到这一点,但不能用BASH!

在我的研究中,我找到了这个链接:

用于测试字符串是否由十进制有效实数组成的正则表达式

其中有一个答案讨论了正则表达式,但据我所知,那只是C语言中的一个函数(还有其他语言)。不过,它似乎有一个很好的答案,所以我尝试了使用grep,但grep不知道该怎么处理它。我尝试了-P,在我的机器上表示将其视为PERL正则表达式,但没有任何结果。-E也不起作用,-F也不行。

为了明确我的意思,我正在尝试像这样的东西,寻找任何输出——从那里,我将修改脚本以利用我得到的任何结果。(换句话说,我期望非符合规则的输入返回空,而有效的行会被重复。)

snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
   echo "不是整数——grep没有返回任何结果"
else
   echo "是整数。"
fi

请问有人能够说明最简单的方法是什么吗?

坦率地说,我认为这是TEST的一个缺点。它应该有一个像这样的标志

if [ -I "字符串" ] ;
then
   echo "字符串是一个有效的整数。"
else
   echo "字符串不是一个有效的整数。"
fi

0
0 Comments

测试字符串是否为有效整数的问题是由下面的内容引起的。解决方法是使用条件语句和正则表达式来判断字符串是否为整数。首先,我们可以使用以下代码来测试字符串是否为整数:

if [ "$1" -eq "$1" ] 2>/dev/null
then
    echo "$1 是一个整数!!"
else
    echo "错误:第一个参数必须是一个整数。"
    echo $USAGE
    exit 1
fi

这种方法还考虑了负数和带有"+"前缀(例如+30)的情况。测试结果如下:

$ int_check.sh 123
123 是一个整数!!
$ int_check.sh 123+
错误:第一个参数必须是一个整数。
$ int_check.sh -123
-123 是一个整数!!
$ int_check.sh +30
+30 是一个整数!!
$ int_check.sh -123c
错误:第一个参数必须是一个整数。
$ int_check.sh 123c
错误:第一个参数必须是一个整数。
$ int_check.sh c123
错误:第一个参数必须是一个整数。

Ignacio Vazquez-Abrams提供的解决方法也很简洁(如果你喜欢正则表达式),但是它不能处理带有"+"前缀的正数,但可以很容易地修复如下:

[[ $var =~ ^[-+]?[0-9]+$ ]]

避免在不必要的情况下使用正则表达式总是一个好主意,因为正则表达式在大多数情况下都很昂贵。这个解决方法可以作为一个一行代码与or语句的组合使用`test || die invalid`。

你的解决方案与正则表达式的解决方案之间有一个明显的区别:整数的大小被检查到bash限制(在我的电脑上是64位)。这个限制不会影响正则表达式解决方案。所以,在64位计算机上,你的解决方案将在严格大于9223372036854775807的数上失败。

这个解决方案不能使用`-ne`,我不认为它能和`-le`、`-ge`等一起工作。

正如我最近发现的那样,还有一些注意事项。

`int_check.sh A` 返回它作为整数???

这是一个优雅的解决方案。只要剥离小数部分,就可以很好地工作。

对于`int_check.sh '1 '`来说,会给出一个错误的结果。有些命令无法处理尾随的空格,比如`seq '1 '`。

我想要限制音量范围从0到100,这个答案是一个很好的起点。

这取决于你想要什么。从技术上讲,"-100"或"+100"不是整数,因为字符"-"和"+"不是整数。

0
0 Comments

问题出现的原因是因为在这个讨论中,有人提出了一个关于测试字符串是否为有效整数的问题。讨论中的第一个回答给出了一种使用case语句的解决方法,但是这个方法并没有被提及,直到讨论的最后。

解决方法是使用以下的case语句来测试字符串是否为有效整数:

case ${variable#[-+]} in
  *[!0-9]* | '') echo Not a number ;;
  * ) echo Valid number ;;
esac

这个解决方法通过在比较之前去掉字符串中的符号来实现。如果去掉符号之后的字符串包含除了数字以外的其他字符,或者为空字符串,则返回"Not a number";否则,返回"Valid number"。

讨论中还提到了需要注意空字符串的情况,即应该将为空字符串的情况也视为不是一个有效的整数:''|*[!0-9]*)

此外,还提供了一个关于这个语法的文档链接:tldp.org/LDP/abs/html/string-manipulation.html。这个链接中描述了如何在case语句中使用这种字符串处理的方法。

讨论中还提到了另一个关于Bash手册中参数扩展的文档链接:Bash manual.。这个链接提供了关于参数扩展的更详细的信息。

总之,这个讨论中提出了一个关于测试字符串是否为有效整数的问题,给出了使用case语句的解决方法,并提供了相关的文档链接。

0
0 Comments

正则表达式 `[[ $var =~ ^[-+]?[0-9]+$ ]]` 用于验证一个字符串是否为有效的整数。下面详细解释一下这个正则表达式的含义:

- `^` 表示输入模式的开头

- `[-+]` 表示负号或正号,`?` 表示前面的字符(即符号)出现 0 次或 1 次

- `[0-9]` 表示任意一个数字,`+` 表示前面的字符(即数字)出现 1 次或多次

- `$` 表示输入模式的结尾

因此,正则表达式匹配一个可选的负号或正号,后面跟着一个或多个十进制数字。

解决方法是在字符串和正则表达式之间使用 `=~` 运算符,将字符串与正则表达式匹配。如果匹配成功,表示字符串是一个有效的整数。

需要注意的是,在字符范围的表示中,有时会出现奇怪的结果。例如,`[A-z]` 不仅包括大写字母和小写字母,还包括空格、方括号、插入符号、下划线和反引号。此外,根据字符排序的方式,例如使用 `d[g-i]{2}` 可能不仅匹配 `dig`,还可能匹配在排序方式中 `sh` 被视为单个字符、位于 `h` 之后的 `dish`。

修正后的正则表达式为 `[[ $var =~ ^[-+]?[0-9]+$ ]]`,添加了正号的匹配,使得字符串能够同时匹配负整数、正整数和无符号整数。

参考链接:

- http://www.tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF

感谢 Ignacio 的帮助,我马上尝试一下。你介意解释一下吗?这样我可以学到一点知识。我理解这个表达式的意思是:“字符串开头(^),可选的减号(-),紧跟着 0 到 9 之间的任意字符(包括 0 和 9)”... 那么 +$ 的意思是什么?谢谢。

`+` 表示前面的字符(即前面的数字)出现 1 次或多次,`$` 表示输入模式的结尾。所以这个正则表达式匹配一个可选的负号,后面跟着一个或多个十进制数字。

关于 ABS 链接的问题,这只是一个侧面的说明。需要注意的是,在指定字符范围时,可能会得到奇怪的结果。例如,`[A-z]` 不仅包括大写字母和小写字母,还包括空格、方括号、插入符号、下划线和反引号。

0