我正在尝试用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。
答案 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