我发现了一个有趣的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
答案 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])) ]]