2017-02-21 40 views
0

Я пытаюсь написать сценарий в bash, который автоматически добавит строку/заменит строку в /etc/rsyslog.conf при изменении сетевого шлюза. Это позволит распределить сервер rsyslog с направленным ведением журнала в конкретный файл журнала.Получение IP-адреса шлюза из сценария Bash завершается с ошибкой, но работает в терминале

Я не смог определить, почему это не удается и надеется, что кто-то с лучшим пониманием может обратиться.

Ниже приведен сценарий.

#!/bin/bash 
GETGATEWAY="route -n | grep 'UG[ \t]' | awk '{print \$2}'" 
echo "This is a test" 
echo $GETGATEWAY 
shopt -s extglob 
$GETGATEWAY 

Результат следует.

Это тестовый маршрут -n | grep 'UG [\ t]' | awk '{print $ 2}' Использование: route [-nNvee] [-FC] [] Список таблиц маршрутизации ядра route [-v] [-FC] {add | del | flush} ... Изменить таблицу маршрутизации для AF ,

route {-h|--help} [<AF>]    Detailed usage syntax for specified AF. 
    route {-V|--version}     Display version/author and exit. 

    -v, --verbose   be verbose 
    -n, --numeric   don't resolve names 
    -e, --extend    display other/more information 
    -F, --fib    display Forwarding Information Base (default) 
    -C, --cache    display routing cache instead of FIB 

= использовать '-A' или '-'; default: inet Список возможных семейств адресов (которые поддерживают маршрутизацию): inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25) netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP) x25 (CCITT X.25)

Если скопировать эхо строку после «Это тест» и вставить на терминале для выполнения, он работает, как ожидалось. route -n | grep 'UG [\ t]' | awk '{print $ 2}'

Я пробовал несколько вариантов оболочки с и без магазина -s extglob.

+0

Само использование дополнительной _pipe_ и '' grep', когда маршрут -n | awk '/ UG [\ t]/{print $ 2}' производит те же результаты, что и 'route -n | grep 'UG [\ t]' | awk '{print $ 2}' 'делает! – user3439894

ответ

0

Я не уверен, почему вы сохраняете последовательность команд в переменной, а затем пытаетесь выполнить ее посредством оценки ($var). Вы можете сделать это:

eval "$GETGATEWAY" 

Без eval, оболочка интерпретирует route как команду и все остальное, в том числе | и т.д., в качестве аргументов к нему. Опция extglob не имеет к этому никакого отношения.

Вы можете посмотреть на этот пост:

Why should eval be avoided in Bash, and what should I use instead?

0

вы должны использовать подстановки команды для вычисления IP-адреса и сохранение его в любой переменной.

var=$(command1|command2|....) 

Пример:

GATEWAY=$(route -n |awk '/UG/{print $2}') 
echo $GATEWAY 
10.1.1.1