bash中单次操作获取grep的输出和返回值

ila*_*sch 12 shell grep bash exit-status

我正在写一个 bash 脚本;我执行某个命令和grep。

pfiles $1 2> /dev/null | grep name # $1 Process Id
Run Code Online (Sandbox Code Playgroud)

响应将类似于:

sockname: AF_INET6 ::ffff:10.10.50.28  port: 22
peername: AF_INET6 ::ffff:10.16.6.150  port: 12295
Run Code Online (Sandbox Code Playgroud)

响应可以是无行、1 行或 2 行。
如果 grep 不返回任何行(grep 返回代码 1),我将中止脚本;如果我得到 1 行,我调用 A() 或 B() 如果超过 1 行。当输出为 1-2 行时,grep 的返回码为 0。

grep 有返回值(0 或 1)和输出。
我怎样才能抓住他们?如果我做这样的事情:

OUTPUT=$(pfiles $1 2> /dev/null | grep peername)
Run Code Online (Sandbox Code Playgroud)

然后变量 OUTPUT 将有输出(字符串);我还想要 grep 执行的布尔值。

pfn*_*sel 14

您可以使用

output=$(grep -c 'name' inputfile)
Run Code Online (Sandbox Code Playgroud)

output然后该变量将包含数字01、 或2。然后你可以使用一个if语句来执行不同的事情。


Sco*_*ott 5

这相当简单:

\n\n
OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)\ngrep_return_code=$?\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果将$(\xe2\x80\xa6)命令替换分配给变量,\n$?将从 .\xc2\xa0\n 中的最后一个命令获取返回码$(\xe2\x80\xa6),当然,\xe2\x80\x99 不需要$?显式引用;\n你可以做类似的事情

\n\n
if OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)\ntthen\n #脚本的其余部分\n \xef\xb8\x99\nfi
\n\n

或者

\n\n
如果OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)\nthen\n 退出\nfi\n#脚本的其余部分\n \xef\xb8\x99\n
\n\n

在命令的输出\n及其返回代码(也称为退出状态)不相关的情况下,此方法很有用。\xc2\xa0\n但是,对于grep,它们高度相关:\n如果它产生输出,则成功。\xc2 \xa0\n如果\xe2\x80\x99t 没有产生输出,则失败。\xc2\xa0\n那么为什么不直接测试输出 xe2\x80\x8a呢?

\n\n
OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)\nif [ "$OUTPUT" ]\ntthen\n #脚本的其余部分\n \xef\xb8\x99\nfi
\n\n

或者

\n\n
OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)\nif [ -z " $OUTPUT" ]\ntthen\n exit\nfi\n#脚本的其余部分\n \xef\xb8\ x99\n
\n\n

PS 你应该总是引用你的 shell 变量引用(例如,"$1")\n除非你有充分的理由不这样做,\n并且你\xe2\x80\x99确信你知道你\xe2\x80\x99在做什么。

\n