Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash函数返回一个意外值_Bash_Function_Shell - Fatal编程技术网

Bash函数返回一个意外值

Bash函数返回一个意外值,bash,function,shell,Bash,Function,Shell,我在BASH中编写了这个函数,它返回了一个意外的值: checkIfUserFound() { isUserFound=$( cat user_uid.txt | grep $ADMIN_TO_UPDATE -B 1 | grep "uid" ) return $isUserFound } 用户uid.txt文件为空(我输入了无效的admin) 但出于某种原因,它返回“1”: 这将打印“用户找到…” 有人知道这是怎么回事吗?从函数返回时不应该得到“0”吗?主要问题是您没有检查管道中

我在BASH中编写了这个函数,它返回了一个意外的值:

checkIfUserFound()
{
   isUserFound=$( cat user_uid.txt | grep $ADMIN_TO_UPDATE -B 1 | grep "uid" )
   return $isUserFound
}
用户uid.txt文件为空(我输入了无效的admin)

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

这将打印“用户找到…”


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

主要问题是您没有检查管道中的任何命令是否失败

管道中最后一个命令的失败(退出代码)将是整个管道的退出值。退出代码在
$?
变量中可用

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

return $?

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


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

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

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

checkIfUserFound()
{
    grep "$ADMIN_TO_UPDATE" -B 1 user_uid.txt |
    grep -q "uid"
}
(还要注意我们如何摆脱

该脚本可能会被有效地重构为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
经常用于检查的命令之一).

我推荐您,尤其是关于它的。哦!我以为它会返回找到的字符串…嗯,那么,如果文件不是空的,我会在中得到错误:“需要数值参数”"return$isuserfound shell函数或您运行的任何程序都不像数学函数。它们可以输出字符串,也可以返回整数退出代码。它们不能返回任意值。根据我刚才的回答,
return$?
确实是多余的;函数已经返回了最新命令的结果代码。如何n我返回grep找到的内容?我想知道它是否返回空字符串
grep
如果找到匹配项,则将其返回代码设置为0,否则设置为1(如果失败,则更一般地设置为非零)我想让函数知道grep是否返回空的,基本上,你发现它有其他的功能吗?我对此相当陌生。如果找到,你写的东西会返回1,否则返回0,对吗?我现在会测试它。即使对于不存在带有“awk”的管理员,它也会返回“true”
if ! checkIfUserFound
then
    echo "Searching..."
else
    echo "User found..."
fi