2017-02-21 8 views
0

ネットワークゲートウェイが変更されたときに自動的に/etc/rsyslog.confに行を追加/置き換えるbashにスクリプトを書き込もうとしています。これにより、指定されたログファイルを使用する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インターネット)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]' | awck '{print $ 2}'

shopt -s extglobの有無にかかわらず、複数のシェルオプションを試しました。

+0

言うまでもなく使用| awk '/ UG [\ t]/{print $ 2}' 'は' route -n | 'と同じ結果を出します。 grep 'UG [\ t]' | awk '{print $ 2}'はそうです! – user3439894

答えて

0

なぜコマンドシーケンスを変数に格納してから、評価($var)で実行しようとしているのかわかりません。シェルはそれへの引数として、など|含めて、コマンドおよび他のすべてとしてrouteを解釈し、evalなければ

eval "$GETGATEWAY" 

:あなたはこれを行うことができます。そしてextglobオプションはこれとは関係ありません。あなたがこの記事を見てみたいことがあり

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

0

あなたはIPアドレスを計算し、任意の変数にそれを保存するためのコマンド置換を使用する必要があります。

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

例:余分_pipe_と `` grep`ルート-nの

GATEWAY=$(route -n |awk '/UG/{print $2}') 
echo $GATEWAY 
10.1.1.1 
関連する問題