Bash - 为什么“0”不被识别为数字?

时间:2012-04-24 19:47:22

标签: bash

我发现了一个有趣的Bash脚本,它将测试变量是否为数字/整数。我喜欢它,但我不明白为什么“0”不被识别为数字?我不能问作者,你好/ 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

2 个答案:

答案 0 :(得分:4)

它不测试它是否是数字/整数。它测试n是否计算为true或false,如果0为false,则为(数字或其他字符串)为真。

答案 1 :(得分:1)

使用pattern matching来测试:

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

虽然它与负整数不匹配,但它会将空字符串错误地匹配为数字。要获得更精确的模式,请启用shell的扩展globbing:

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

并匹配小数

[[ $n == @(?(-)+([0-9])?(.*(0-9))|?(-)*([0-9]).+([0-9])) ]]