请在这件事上给予我帮助。
我正在做一个 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
之后的返回值。在这种情况下,只需保存该值并继续:if
fi
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";}}'