捕获 Unix 中最后一个返回值

捕获 Unix 中最后一个返回值

请在这件事上给予我帮助。

我正在做一个 grep 测试 file.txt,我想捕获整个值并打印它。我正在这样做,

grep test file.txt
if [ "$?" -eq 0]
then
echo success
else
echo fail
fi

在此代码中,无论 grep 是否返回值,退出代码都为 0,表示命令成功。

我不想执行以下操作,因为我的实际代码有重复的 grep,比如说 10 次,但它不起作用。

a=`grep test file.txt`
if [ "$a" -eq "" ]
then
echo fail
else
echo success
fi

我正在寻找像这样的简单解决方案,

echo $(anything) 应该捕获该值。

答案1

你的结果与我的不符

echo 'some test here' > file.txt
grep test file.txt
echo $?    # returns 0

echo 'something else here' > file.txt
grep test file.txt
echo $?    # returns 1

此外,当我运行您自己的完整代码示例时,我根据文件中是否存在关键字来获得“成功”或“失败”。 (我在0和之间添加了缺少的空格,]因为否则您会收到错误,-bash: [: missing `]'并且您没有报告该错误。)

grep test file.txt
if [ "$?" -eq 0 ]
then
    echo success
else
    echo fail
fi

但是,作为一种风格建议,我会直接测试grep命令,如下所示

if grep test file.txt
then
    echo success
else
    echo fail
fi

让我震惊的是,您可能想使用...块grep之后的返回值。在这种情况下,只需保存该值并继续:iffi

grep test file.txt
ss=$?
if [ 0 -eq $ss ]
then
    echo success
else
    echo fail
fi
# Here $ss still contains the return value from grep

答案2

如果您在和space之间添加一个,您的原始代码应该按预期工作。0]

grep test file.txt
if [ "$?" -eq 0 ]
then
echo success
else
echo fail
fi

答案3

grep test file.txt
if [ "$?" -eq 0]
then
  echo success
  exitcode=0
else
  echo fail
  exitcode=1 
fi
exit ${exitcode}

我不确定您在寻找什么,但如果您希望脚本以与命令相同的代码退出grep,那么这应该适合您。

如果您正在寻找其他东西,您应该尝试更好地解释自己。

答案4

可以通过 awk 进行管道传输,而不是依赖返回码。

grep posix test_file.txt|awk 'BEGIN{matches=0}{matches++}END{if(matches>0){print "success";}else{print "fail";}}'

仅打印第一个匹配项:

grep testvalue test_file.txt|awk 'BEGIN{matches="";}{matches=$0;}END{if(matches!=""){print "success";print matches;}else{print "fail";}}'

并通过值捕获功能显示每个 grep 匹配项:

grep testvalue test_file.txt|awk 'BEGIN{matches="";}{matches=matches $0 "\n";}END{if(matches!=""){print "success";print matches;}else{print "fail";}}'

相关内容