在以下bash代码示例中。我希望return 0
调用函数时会退出0
。但是,该功能继续向前。
ignoringReturnStatement(){
local seconds="$1"
[[ "$seconds" -eq "0" ]] && (echo "equals 0" && return 0 )
echo "Didn't exit with 'return 0'"
return 1
}
ignoringReturnStatement 0 && echo "Return code truthy" || echo "Return code falsy"
输出
equals 0
Didn't exit with 'return 0'
Return code falsy
世界上为什么return 0
被忽略?是否以某种方式限制了其所在的括号()的范围? (我习惯于不进行大量的范围缩小操作,这将非常令人惊讶)
我可以使用更详细的if syntax
来重构此代码,使其按预期工作:
respectingReturnStatement(){
local seconds="$1"
if [[ "$seconds" -eq "0" ]]; then
echo "equals 0"
return 0
fi
echo "Didn't exit with 'return 0'"
return 1
}
respectingReturnStatement 0 && echo "Return code truthy" || echo "Return code falsy"
但是为什么&& (... return 0)
语法在这里不起作用?
答案 0 :(得分:3)
它没有被忽略;它在子shell中执行。它是否失败对我来说不是立即显而易见的,因为它没有在该外壳程序的函数中使用,或者是否从该子外壳程序“返回”到该函数。
要解决此问题,请使用{...}
而不是(...)
,以使return
与其他函数在同一外壳中执行。
foo (){
local seconds="$1"
[[ "$seconds" -eq "0" ]] && { echo "equals 0"; return 0; }
echo "Didn't exit with 'return 0'"
return 1
}
没有理由在&&
上使用;
,因为即使出于某种罕见的原因echo
失败,您也想返回。