2017-02-21 79 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 
相關問題