我无法弄清楚如何确保传递给我的脚本的参数是数字还是其他类型。
我想要做的只是像这样:
test *isnumber* $1 && VAR=$1 || echo "need a number"
需要帮助吗?
这个还有点粗糙,但对于新手来说更友好一些。
if [ $number -ge 0 ]
then
echo "Continue with code block"
else
echo "We matched 0 or $number is not a number"
fi
如果$number不是一个数字,这将导致错误并打印"Illegal number:",但它不会中断脚本。奇怪的是,我找不到一个测试选项来测试整数。
这里的逻辑将匹配大于或等于0的任何数字。
[[ ]]
而不是[ ]
,否则会在非整数字符串上失败。 - naught101-ge
表示大于等于,因此不应该漏掉 0,但会漏掉负数。以上解决方案也更好,因为 [[ ]]
对于 @defim 的答案总是会得到一个数字,但对于 [ ]
来说则会生成一个错误并评估为 false。 - Marcus[ "$number" -eq "$number" 2>/dev/null ] && echo isNumber || echo noNumber
- defim
test && echo "foo" && exit 0 || echo "bar" && exit 1
方法可能会产生一些意想不到的副作用 - 如果 Echo 失败了(也许输出到了一个关闭的FD),exit 0
将被跳过,然后代码将尝试echo "bar"
。如果这也失败了,&&
条件将失败,甚至不会执行exit 1
! 使用实际的if
语句而不是&&
/||
更不容易出现意外的副作用。 - Charles Duffy[[ $1 =~ "^[0-9]+$" ]] && { echo "number"; exit 0; } || { echo "not a number"; exit 1; }
大括号表示不应该在子shell中执行事情(如果使用圆括号()
就会明确这种情况)。注意:永远不要漏掉最后的分号。否则,你可能会导致bash打印出最丑陋(并且毫无意义)的错误消息... - syntaxerror[[ 12345 =~ ^ [0-9] + $]] && echo OKKK || echo NOOO
。 - Treviño