我用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”吗?
答案 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
}