2014-01-09 3 views
2

с выдачей команды для выполнения функции броузера в сценарии BASH.Использование кода сценария оболочки, переданного в качестве аргумента функции

Команда: [named -V|grep BIND|awk '{printf ($2);}'] работает в оболочке, но не устанавливает вывод в переменную.

Желаемая выход для $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" 

ответ

1

Вы хотите: VER=$(eval "$2") - Кавычки очень важно содержать eval'ed сценарий как одно слово.

Вам также необходимо изменить 2-й аргумент:

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

без обратной косой черты, оболочка будет видеть $2 в двойных кавычках и заменить его.

Grep удаляется просто потому, что это необязательно: awk может искать шаблоны.

+0

СПАСИБО СМОТРЕТЬ БОЛЬШЕ. я стучал головой по столу в течение 4 часов – user3175622

+0

Что такое сделка с '/ BIND' /? Я понимаю беглые символы NeverMind я вижу, что вы комбинировали AWK и GREP – user3175622

+0

Почему мы призываем OP использовать 'eval' вообще? Это, конечно, не соответствует лучшим практикам. –

1

См BashFAQ #50 подробное обсуждение того, почему команды не должны храниться в строках (и, как и почему это не удается на практике), и BashFAQ #48 поясняющая, почему eval, в частности, к ошибкам.

Гораздо безопаснее подход для хранения кода в функциях, и передать эти функции по имени:

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

... будет правильно работать с вашей исходной функции.

Смежные вопросы