いくつかの簡単な合格/失敗テストスクリプトを作成しようとしていますが、以下に説明するようにいくつかの問題に直面しています。私の意図は、問題が検出されたときに発生するさまざまなスキャンを実行するためにファイルを解析しながら、コマンド(results.txt
pingなど)の結果全体をファイルに保存することです。results.txt
#!/bin/bash
ping -c 20 google.com > results.txt
packetloss = `awk '/packet loss/{x=$6} END{print x}' results.txt`
echo "$packetloss" >> debug.txt
# if packetloss > 0, add to an error.txt to fail
# if avg ping time > 5ms, add to an error.txt to fail
packetloss変数を取得できませんでしたawk
ファイルの情報results.txt
(表示用にデバッグファイルに送信されます)シェルスクリプトに、この問題と関連する回避策を防ぐことができるものがあるかどうか疑問に思います。
手動で実行すると、予想される「0%」awk
が返されます。results.txt
答え1
周囲のスペースは許可されていません=
!
だから:
#!/bin/bash
ping -c 20 google.com > results.txt
packetloss=$(awk '/packet loss/{print $6}' results.txt)
echo "$packetloss" >> debug.txt
またはより短く:
ping -c 20 google.com |
awk '/packet loss/{sub(/%/, "");print $6 >> "debug.txt"}'
メモ:
x
変数に値を割り当てる必要はなく、$6
直接印刷できます。- AWK自体は出力として新しいファイルを生成できます。
- バックティック
`
次のような古いスタイルのコマンドの置き換えに使用されます。
foo = `コマンド`
foo=$(command)
代わりにこの構文を使用することをお勧めします。内部バックスラッシュ処理は$()
驚くべきことではなく、$()
入れ子にするのが簡単です。
確認するhttp://mywiki.wooledge.org/BashFAQ/082
使用する追加ソリューション真珠:
ping -c 20 google.com |
perl -lne '/(\d+)%\s+packet\s+loss/ and print $1' >> debug.txt
答え2
#!/usr/bin/perl
my $host=shift or die("Usage $0 host\n");
open(PING , "-|", "ping -c 20 $host") or die;
open(DEBUG, ">>", "debug.txt" ) or die;
while(<PING>){
if(m!(\d+)% packet loss! ){ $Lost=$1 }
if(m!rtt.*= (.+?)/(.+?)/(.+)!){ $Avg=$2 }
}
if ( $Lost > 0 ) { print DEBUG "not ok: lost pcks ($Lost%)\n" }
elsif( $Avg > 5 ) { print DEBUG "not ok: too slow ($Avg)\n" }
else { print DEBUG "ok: ping\n" }