2017-02-21 45 views
0

我试图在bash中编写一个脚本,当网络网关发生更改时,脚本将自动添加一行/在/etc/rsyslog.conf中替换一行。这将启用rsyslog服务器的定向日志记录分发到特定的日志文件。从Bash脚本中获取网关IP失败,但在终端中工作

我还没有能够确定为什么这会失败,并希望有更好的理解能够解决的人。

以下是脚本。

#!/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'或' - ';默认: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}'

我试过了多个shell选项,但没有使用shopt -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,shell解释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 
相关问题