使用shell脚本代码作为参数传递给函数

时间:2014-01-09 00:54:54

标签: bash

有问题执行命令执行在BASH脚本中抛出一个函数。

命令:[named -V|grep BIND|awk '{printf ($2);}']在shell中工作,但不会将输出设置为varable。

$VER的所需输出应为:9.8.1-P1

我认为问题是|

但是,我收到了:

BIND 9.8.1-P1 built with '--prefix=/usr' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--sysconfdir=/etc/bind' '--localstatedir=/var' '--enable-threads' '--enable-largefile' '--with-libtool' '--enable-shared' '--enable-static' '--with-openssl=/usr' '--with-gssapi=/usr' '--with-gnu-ld' '--with-geoip=/usr' '--enable-ipv6' 'CFLAGS=-fno-strict-aliasing -DDIG_SIGCHASE -O2' 'LDFLAGS=-Wl,-Bsymbolic-functions -Wl,-z,relro' 'CPPFLAGS=-D_FORTIFY_SOURCE=2'

如果您有任何信息,请告诉我

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
function version {
  if [ `builtin type -p $3` ]; then
    VER=`$2`
    if [[ -n $VER ]]; then
#     echo "$VER" > $DIR/ver/$1
      echo "VER=$VER"
      PID=$(pidof $3)
      if [[ -n "$PID" ]]; then
#       echo "$PID" > $DIR/pid/$1
       echo "PID=$PID"
      fi
    fi
  else
    echo "$1 not installed"
  fi
}
version "bind" "named -V|grep BIND|awk '{printf ($2);}'" "named"

2 个答案:

答案 0 :(得分:1)

您想要:VER=$(eval "$2") - 引号对于将eval的脚本包含为单个单词非常重要。

您还需要更改第二个参数:

"named -V|awk '/BIND/ {print \$2}'"
#                            ^^^                       

如果没有反斜杠,shell会在双引号内看到$2并替换它。

grep被删除只是因为没有必要:awk可以搜索模式。

答案 1 :(得分:1)

有关为什么命令不应存储在字符串中的详细讨论(以及在实践中失败的方式和原因),请参阅BashFAQ #50,并BashFAQ #48描述为什么eval特别是错误易发。

更安全的方法是将代码存储在函数中,并按名称传递这些函数:

get_named_version() { named -V | awk '/BIND/ {print $2}'; }
version bind get_named_version named

...将与原始功能一起正常工作。