我需要检查 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