2017-06-13 7 views
0

コマンドを何度もコピーして貼り付けなくても、以下のように書く方法はありますか?bash if文が冗長な行を削除する

成功 - それはコンソールに「グレップ」を印刷し、ログファイルに

失敗 - それは同様に、「コンソールおよびログファイルに出力されます

if wget -S --spider ${proxystring}"$1" 2>&1 | grep 'HTTP/1.1 200 OK'; then 
    wget -S --spider ${proxystring}"$1" 2>&1 | grep 'HTTP/1.1 200 OK' >> $LOGFILE 
    return 0; 
    else 
     wget -S --spider ${proxystring}"$1" 2>&1 | $TEELOG 
    return 1; 
    fi 

答えて

0

ストア出力であなたは一度だけwgetコマンドを実行する必要が

ret_value=`wget -S --spider ${proxystring}"$1" 2>&1 | grep 'HTTP/1.1 200 OK';` 
if [ $? -eq 0 ]; then 
    echo $ret_value >> $LOGFILE 
    return 0; 
else 
    wget -S --spider ${proxystring}"$1" 2>&1 | $TEELOG 
    return 1; 
fi 
2

一時ファイルに結果を保存し、それを仕事::変数は、この変数に好きなだけ時間を使う。

# Make temporary file 
tmpfile=$(mktemp) 

# put wget output in temp file 
wget -S --spider "${proxystring}$1" 2>&1 > "$tmpfile" 

# grep in temp file 
grep_result=$(grep 'HTTP/1.1 200 OK' "$tmpfile") 

# If string found... 
if [ $? -eq 0 ]; then 
    # Append grep results to log file 
    echo "$grep_result" >> $LOGFILE 

    # remove temp file 
    rm "$tmpfile" 

    # Success!! 
    return 0; 

# otherwise... 
else 
    # put the wget results in TEELOG 
    cat "$tmpfile" >> "$TEELOG" 

    # remove temp file 
    rm "$tmpfile" 

    # Fail :(
    return 1; 

fi 
0

あなたが利用できる特別なケースがあります。 grep -v 'HTTP/1.1 200 OK'を使用すると、一致が失敗した場合はに出力されますが、成功した場合はが正確にになります(このようなステータス行には他のテキストはありません)。

はそのように、あなたは無条件$TEELOGgrepの出力を書き込むことができますが、ハードコードLOGFILEから200応答がgrepを失敗したとき。

if ! wget -S --spider "$proxystring$1" 2>&1 | grep -v 'HTTP/1.1 200 OK' | $TEELOG; then 
    return 1 
else 
    echo 'HTTP/1.1 200 OK' >> "$LOGFILE" 
    return 0 
fi 

(ちなみに、私は TEELOGtee somefileのようなものである疑いがある、代わりに変数のシェル関数を使用します。

TEELOG() { 
    tee somefile 
} 

+0

'TEELOG ="ティー-a $ {LOGFILE } "これは関数ほど良くないのですか? – bc81

+0

いいえ。変数はデータ用です。関数はコード用です。 – chepner

+0

情報ありがとう!まだ勉強しようとしています。 – bc81

関連する問題