如何将命令参数 ($1, $2) 更改为整数?

如何将命令参数 ($1, $2) 更改为整数?

$1 $2我从命令行获得了脚本的几个参数 ( )。

我一直在尝试测试它们,以确保输入的值不是垃圾:

if [ $1 ]; then
    INPUT=$1
if [[ -n ${INPUT//[0-9]/} ]]; then

即:我试图确保它$1不为空,并且由 0-9(数字)组成,即有人没有输入script string more_strings或简单的、无参数的script而不是类似的东西script 12 321

但随后尝试将$INPUT(我也尝试过 $1)视为整数:

if [ $INPUT -gt 100 ]; then
    INPUT=100
fi

失败了,通过回显测试,看起来我有一个字符串(即使我使用了 gt - 我认为这意味着将其评估为整数?),并且我不确定如何将其/评估 $1 为一个整数?

http://mywiki.wooledge.org/BashFAQ/054

建议我这样做:

if [[ $1 != *[!0-9]* ]]; then

但我不明白那里发生了什么。不等于不0-9???为什么 *?

这看起来很有趣:

declare -i $1

但似乎永久改变了 1 美元?直到重新分配?

我想知道如何测试我的输入,以确保它们是 A) 字符串或 B) 数字/整数 - 然后如何在我的脚本中使用它们(或如何转换它们)。最好有解释。

我尝试对之前的问题进行一些搜索,但显然我搜索的是错误的术语 - 因为这似乎是一件非常基本的事情,我已经忘记了如何做/应该已经在其他地方得到了回答。

这里也没有找到:

https://ss64.com/bash/test.html

也许需要睡觉时间。

答案1

在 中[[ .. ]]=运算符实际上是模式匹配,因此[[ $1 != *[!0-9]* ]]测试 的值是否$1与模式不匹配*[!0-9]*

这里使用的模式与文件名扩展的模式相同,因此*匹配任何字符、[abc]括号之间的任何字符和[!abc]/或[^abc]任何字符不是括号之间(不包括开头的!^)。实际上,它测试是否$1包含一些不是0to中的数字的字符9


declare -i var会将变量标记var为整数变量:对它的赋值将被解释为在算术上下文中,因此declare -i a; a=3+5; echo $a;将输出8。但你不能在位置参数上使用它,例如$1.相反,declare -i $1会采用包含在中的字符串$1并使用作为变量名。 (注意$上面没有declare -i a。)

您不能真正用来declare -i测试某物是否是数字,因为算术上下文中的字符串被视为变量名字。这不是一个错误:declare -i a; b=1+2; a=b; echo $a;。相反,它打印3,这可能是也可能不是您想要的。

答案2

检查是否有输入,然后是否是数字(1 位或更多位),我使用了这个全局:

if [ $2 ]; then INPUT=$2 if [[ $INPUT = +([[:digit:]]) ]]; then

这似乎正在测试非数字输入:

if [[ -n ${INPUT//[0-9]/} ]]; then

答案3

不像 ilkkachu 那样有一个很好的解释

但你可以尝试这个方法

[ ! -z $1 -a $1 -eq $1 ] 2>/dev/null && echo "integer $1" || echo "not integer $1"

相关内容