Bash函数返回意外值

时间:2019-01-29 10:54:44

标签: bash function shell

我用BASH编写了此函数,它返回了意外的值:

checkIfUserFound()
{
   isUserFound=$( cat user_uid.txt | grep $ADMIN_TO_UPDATE -B 1 | grep "uid" )
   return $isUserFound
}

user_uid.txt文件为空(我输入了无效的管理员)。

但是由于某种原因,它返回“ 1”:

checkIfUserFound
isUserFound=$?

if [ "$isUserFound" -eq "0" ];
then
    echo "Searching..."
else
    echo "User found..."
fi

这将打印“用户已找到...”

有人知道返回值是怎么回事吗?从函数返回时,我不应该得到“ 0”吗?

2 个答案:

答案 0 :(得分:1)

return的参数必须是一个数字(一个小整数-范围是0到255)。但是grep已经设置了返回代码以指示是否找到了匹配项,并且函数已经返回了函数中最后一条命令的返回代码。所以你真正需要的就是

checkIfUserFound()
{
    grep "$ADMIN_TO_UPDATE" -B 1 user_uid.txt |
    grep -q "uid"
}

(还要注意我们如何摆脱useless use of cat).

该脚本可能有用地重构为Awk。也许我猜对了你想要什么:

checkIfUserFound()
{
    awk -v user="$ADMIN_TO_UPDATE" '/uid/ { p=1; next }
    p { if ($0 ~ user) found=1; p=0 }
    END { exit 1-found }' user_uid.txt
}

最后,调用此函数的代码应检查是否成功,而不是是否打印0。

if ! checkIfUserFound
then
    echo "Searching..."
else
    echo "User found..."
fi

请注意,[并不是if命令语法的一部分(尽管[是其结果代码if经常用于检查的命令之一)。

答案 1 :(得分:0)

主要问题是您不检查管道中任何命令是否失败。

管道中最后一条命令的失败(退出代码)将是整个管道的退出值。该退出代码位于$?变量中。

由于要从函数返回管道的成功/失败,因此需要返回以下值:

return $?

如果管道没有失败,那么管道的结果将是stdout的输出,并将其放入$isUserFound变量中。由于它不是有效的退出代码(必须为数字),因此无法返回。


由于您不需要$isUserFound变量,并且想返回管道的结果,因此您的函数可以简化为

checkIfUserFound() {
   cat user_uid.txt | grep $ADMIN_TO_UPDATE -B 1 | grep "uid" 2>&1 >/dev/null
}