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然后该变量将包含数字0、1、 或2。然后你可以使用一个if语句来执行不同的事情。
这相当简单:
\n\nOUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)\ngrep_return_code=$?\nRun Code Online (Sandbox Code Playgroud)\n\n如果将$(\xe2\x80\xa6)命令替换分配给变量,\n$?将从 .\xc2\xa0\n 中的最后一个命令获取返回码$(\xe2\x80\xa6),当然,\xe2\x80\x99 不需要$?显式引用;\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呢?
OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)\nif [ "$OUTPUT" ]\ntthen\n #脚本的其余部分\n \xef\xb8\x99\nfi\n\n
或者
\n\nOUTPUT=$(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在做什么。