从Bash脚本获取网关IP失败,但在终端中工作

时间:2017-02-21 02:56:36

标签: bash debian

我正在尝试用bash编写一个脚本,当网络网关发生变化时,它会自动在/etc/rsyslog.conf中添加一行/替换一行。这样可以将带有定向日志记录的rsyslog服务器分发到特定的日志文件。

我无法确定为什么会失败,希望有更好理解的人可以解决。

以下是剧本。

#!/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)

如果在“This is a test”之后复制回显线并粘贴到要执行的终端上,它将按预期工作。 路线-n | grep'UG [\ t]'| awk'{print $ 2}'

我尝试了多种shell选项,包括没有shopt -s extglob。

2 个答案:

答案 0 :(得分:0)

我不确定为什么要将命令序列存储在变量中,然后尝试通过评估($var)执行它。你可以这样做:

eval "$GETGATEWAY"

如果没有eval,shell会将route解释为命令,并将其他所有内容(包括|等)解释为它的参数。 extglob选项与此无关。

您可能想看一下这篇文章:

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

答案 1 :(得分:0)

您应该使用命令替换来计算IP地址并将其存储到任何变量。

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

示例:

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