0

我发现了一个有趣的 Bash 脚本,它可以测试变量是否为数字/整数。我喜欢它,但我不明白为什么“0”不能被识别为数字?我不能问作者,hi/shi 是匿名的。

#!/bin/bash

n="$1"

echo "Test numeric '$n' "
if ((n)) 2>/dev/null; then
n=$((n))
echo "Yes: $n"
else
echo "No: $n"
fi

谢谢!

更新 - 2012 年 4 月 27 日。

这是我的最终代码(短版):

#!/bin/bash

ANSWER=0
DEFAULT=5
INDEX=86

read -p 'Not choosing / Wrong typing is equivalent to default (#5): ' ANSWER;

shopt -s extglob
if [[ $ANSWER == ?(-)+([0-9]) ]]
  then ANSWER=$((ANSWER));
  else ANSWER=$DEFAULT;
fi

if [ $ANSWER -lt 1 ] || [ $ANSWER -gt $INDEX ]
  then ANSWER=$DEFAULT;
fi
4

2 回答 2

4

它不测试它是否是数字/整数。它测试 n 评估为真或假,如果 0 为假,否则(数字或其他字符串)为真。

于 2012-04-24T19:48:52.610 回答
1

使用模式匹配来测试:

if [[ $n == *[^0-9]* ]]; then echo "not numeric"; else echo numeric; fi

但这不会匹配负整数,并且会错误地将空字符串匹配为数字。要获得更精确的模式,请启用 shell 的扩展通配符:

shopt -s extglob
if [[ $n == ?(-)+([0-9]) ]]; then echo numeric; else echo "not numeric"; fi

并匹配一个小数

[[ $n == @(?(-)+([0-9])?(.*(0-9))|?(-)*([0-9]).+([0-9])) ]]
于 2012-04-24T20:03:18.900 回答