如何检查 bash 脚本的输入参数是否是以 10 为基数的数字?

如何检查 bash 脚本的输入参数是否是以 10 为基数的数字?

我需要检查 bash 脚本的输入参数是否是以 10 为基数的数字。我能怎么做?

答案1

您可以使用模式匹配(如果您不想接受前导 0,请改进正则表达式):

if [[ $num =~ ^[+-]?[1-9][0-9]*$ ]]
then
echo Decimal
else
echo Not decimal
fi

答案2

将其与自身进行比较,同时强制进行十进制解释。正如shell算术手册中所见:

以 0 开头的常量被解释为八进制数。前导“0x”或“0X”表示十六进制。否则,数字采用以下形式 [碱基#]n,其中可选基数是 2 到 64 之间的十进制数,表示算术基数,n 是该基数中的数字。如果省略 base#,则使用基数 10。指定 n 时,大于 9 的数字按小写字母、大写字母、“@”和“_”的顺序表示。如果底数小于或等于 36,则小写和大写字母可以互换使用来表示 10 到 35 之间的数字。

因此,如果这是你可以做的第一个论点......

再次编辑以适应负面输入

#!/bin/bash
b=${1#-}
if [[ $b =~ ^[0-9]+$ ]]; then                       #If it's all numbers
        a=$((10#$b))                                #create a base 10 version
        if [ "$a" == "$b" ]; then                   #if they LOOK the same...
                echo "$b is Base 10!"; exit 1; fi;  #It's base 10; exit.
fi
    echo "$b is not base 10"                        #If it has letters or $a and $b look different, it's not base 10.

此代码将接受任何输入并告诉您它是否以 10 为基数。 arg 首先去掉负号,然后与 $a 进行非数字比较,因为 012 -eq $((10#012));但我们不希望脚本告诉我们它是十进制,因为它不是。

root@xxxx:~# ./testing.sh -124124
124124 is Base 10!
root@xxxx:~# ./testing.sh 58135
58135 is Base 10!
root@xxxx:~# ./testing.sh aksjflkfj929148
aksjflkfj929148 is not Base 10

相关内容