use*_*293 11 bash shell-script
如果数字是有效的十位数字,我有一个函数返回 1:
valNum()
{
flag=1
if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
echo "Invalid Number"
flag=0
fi
return $flag
}
Run Code Online (Sandbox Code Playgroud)
它被称为:
if [[ $(valNum $num) -eq 1 ]]; then
#do something
fi
Run Code Online (Sandbox Code Playgroud)
如果数字有效,该函数工作正常,但如果输入无效数字,则显示语法错误。
小智 16
@choroba 的回答是正确的,但是这个例子可能更清楚:
valNum $num
valNumResult=$? # '$?' is the return value of the previous command
if [[ $valNumResult -eq 1 ]]
then
: # do something
fi
Run Code Online (Sandbox Code Playgroud)
这个例子有点长(设置$valNumResult
然后查询那个值),但更明确地描述了发生的事情:valNum()
返回一个值,并且可以查询和测试该值。
PS 请帮自己一个忙,并0
为true
和非零返回false
。这样你就可以在失败的情况下使用返回值来指示“我们失败的原因”。
bash 中的函数只能返回退出代码。相反,命令替换用于获取命令或函数的标准输出。因此,要检查返回的标志,您不需要替换:
if valNum "$num" ; then
# ...
fi
Run Code Online (Sandbox Code Playgroud)
但是,要使其正常工作,如果数字有效,则应返回 0,否则应返回 1(退出代码 0 表示没有错误)。
您不能从 shell 函数返回任意结果。您只能返回一个状态代码,它是 0 到 255 之间的整数。(虽然您可以将更大的值传递给return
,但它会以256 为模被截断。)该值必须为 0 表示成功,不同的值表示失败;按照惯例,您应该坚持使用 1 到 125 之间的错误代码,因为更高的值具有特殊含义(126 和 127 的外部命令错误,被更高值的信号杀死)。
由于您在此处返回是或否结果,因此状态代码是合适的。由于flag
似乎表示成功或失败,您应该使用常规值 0 表示成功,1 表示失败(与您所写的相反)。然后您可以直接在 if 语句中使用您的函数。
valNum ()
{
local flag=0
if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
echo 1>&2 "Invalid Number"
flag=1
fi
return $flag
}
if valNum "$num"; then
#do something
fi
Run Code Online (Sandbox Code Playgroud)
如果需要区分故障代码,直接调用该函数即可。在它返回后,故障代码立即在$?
. 然后,您可以使用 case 语句检查它:
valNum "$num"
case $? in …
Run Code Online (Sandbox Code Playgroud)
如果您稍后需要使用状态代码,请在$?
被下一个命令覆盖之前将其保存到另一个变量中。
valNum "$num"
valNum_status=$?
Run Code Online (Sandbox Code Playgroud)
您编写的内容不起作用,因为命令替换$(…)
扩展到函数的输出,在您的代码中,它要么是错误消息,要么是空的, never 1
。
如果您需要传递的信息多于状态码允许的 shell 函数之外的信息,您有两种可能性:
$(valNum "$num")