如何在使用管道和撇号时将bash命令的输出捕获到变量中?

时间:2015-02-01 20:25:39

标签: linux bash ubuntu-14.04

我不确定如何通过bash将命令的输出保存到变量中:

PID = 'ps -ef | grep -v color=auto | grep raspivid | awk '{print $2}''

我是否必须为撇号或管道使用特殊字符?

谢谢!

2 个答案:

答案 0 :(得分:1)

要在shell中捕获命令的输出,请使用命令替换:$(...)。因此:

pid=$(ps -ef | grep -v color=auto | grep raspivid | awk '{print $2}')

注释

  • 在shell中进行赋值时,等号周围不能有空格。

  • 在为本地使用定义shell变量时,最好使用小写或混合大小写。对系统重要的变量以大写形式定义,您不希望意外覆盖其中一个变量。

简化

如果目标是获取raspivid流程的PID,那么grepawk可以合并为一个流程:

pid=$(ps -ef | awk '/[r]aspivid/{print $2}')

请注意从输出中排除当前流程的简单技巧:我们搜索raspivid而不是搜索[r]aspivid。字符串[r]aspivid与正则表达式[r]aspivid不匹配。因此,当前进程将从输出中删除。

awk

的灵活性

为了展示awk如何替换对grep的多次调用,请考虑以下情况:假设我们要查找包含raspivid未包含的行包含color=auto。使用awk,两个条件都可以逻辑组合:

pid=$(ps -ef  | awk '/raspivid/ && !/color=auto/{print $2}')

此处/raspivid/需要与raspivid匹配。 &&符号表示逻辑“和”。正则表达式!之前的/color=auto/表示逻辑“不”。因此,/raspivid/ && !/color=auto/仅匹配包含raspivid但不包含color=auto的行。

答案 1 :(得分:0)

更直接的方法:

pid=$(pgrep raspivid)