如何将awk输出传递给bash变量?

时间:2014-06-03 13:18:36

标签: linux bash awk

#!/bin/bash

function init(){

   echo $(\

      ps -aef | \
      awk -v var=$1 -d 'm=/var/{ if ($3 == 1)  print $2 }\
      END{ if(!m)  print 0 }' \

   )
}

//Always return 0 instead PID
MyVar=`init nginx`

当这些命令未包含在函数中时,它可以正常工作

纠正(关于此代码必须执行的操作): 这些代码片段是我的启动/重启/停止脚本的草稿 nginx + mysql-server + php-fpm。当脚本收到“start”命令时,函数init()必须决定:服务器是否正在运行?如果init()返回值!= 0,则表示服务器已在运行

P.S。我非常感谢你的答案我希望它们会有用

2 个答案:

答案 0 :(得分:2)

  1. 您的测试用例不符合规定:

    • 它使用//作为评论(不是#
    • 测试从不输出任何内容 - 因此无法输出0
    • 如果从其他地方调用此脚本,它将始终返回0,因为这是最后一个命令的状态。在这种情况下,您可以将exit 1添加到脚本的最后一行进行测试。
  2. 您没有说明您要完成的任务。我的猜测是你想要nginx的PID。为此,您应该使用pgrep nginx而不是复杂的awk脚本。

  3. 由于if(!m) print 0,它可能会返回0。但我们没有完整的图片。

  4. 你必须使用gawk。在BSD上运行时,你的awk脚本相当冗长。由于你没有解释目的是什么,我只能猜你想要PID。

  5. 您不需要echo它是多余的

  6. 您可以同时使用反引号``$()将输出输入变量

  7. 此脚本将返回第一个参数的PID:

    #!/usr/local/bin/bash
    function init(){
      pgrep $1
    }
    MyVar=`init $1`
    echo Result: $MyVar
    

    此脚本将使用awk对行进行计算。输入filename作为第一个参数:

    #!/usr/local/bin/bash
    function init(){
      cat $1 | awk '{printf("%5d : %s\n", NR,$0)}'
    }
    MyVar=$(init $1)
    echo Result: $MyVar
    

    更改#!以匹配您的bash位置。

答案 1 :(得分:0)

您的脚本有几个无意义的间接级别,这可以很好地将输出保存到变量:

variable=$( ps -aef | awk  '{ /* awk script */ }' )

你不需要shell函数,你绝对不需要重新echo输出,但你需要修复你的awk脚本。