我想用一些输入检查来调用一个函数(输入应该是1到21之间的整数)。如果可以,则执行回显“调用”,否则仅打印有关无效输入的消息。
我尝试使用以下简化示例,它适用于无效情况,但不适用于有效情况。怎么了?
function _check_num ()
{
[[ "$1" =~ ^[0-9]+$ ]] && [ "$1" -ge 1 -a "$1" -le 21 ] || echo "input should be (1-21)" && return 1 // one-liner
}
function _call()
{
_check_num $1 && echo "invoke only if input is 1-21" // does not invoke given valid input
}
注意:请向我解释此单例案例的根本原因。
不要使用&&
和||
代替if
语句的链。&&
并且||
具有相等的优先级,所以a && b || c
运行c
如果任一 a
或b
失败; 它不等于if a; then b; else c; fi
。
a && b || c && d
被解析为((a && b) ||c) && d
,不是(a && b) || (c && d)
。
使用expicitif
语句使您的代码可读。(也不要-a
在内部使用[...]
;它被认为是模棱两可和过时的。)
function _check_num ()
{
if [[ "$1" =~ ^[0-9]+$ ]] && [ "$1" -ge 1 ] && [ "$1" -le 21 ]; then
return 0
else
echo "input should be (1-21)" >&2
return 1
fi
}
可读性较低的版本将类似于以下内容,使用花括号将命令正确分组。
function _check_num ()
{
{
[[ "$1" =~ ^[0-9]+$ ]] && [ "$1" -ge 1 ] && [ "$1" -le 21 ]
} || {
echo "input should be (1-21)" >&2 && return 1
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句