0

現在のpingと平均的なpingを判別するために使用する予定の小さなbashファイルがあります。

#!/bin/bash
output=($(ping -qc 1 google.com | tail -n 1))
echo "`cut -d/ -f1 <<< "${output[3]}"`-20" | bc

これは私のpingを出力します-20ms、これは私が望む数です。ただし、+数値が正の場合はaを追加し、「ms」を追加します。

これは私の包括的な問題に私をもたらします:エスケープとそのような重い「インデント」に関するBash構文は一種の不安定です。

やりたいことを行う方法の答えには満足しますが、この種のことを処理するためのbash構文の正確な動作へのリンクまたは説明が必要です。

4

4 に答える 4

1
output=($(ping -qc 1 google.com | tail -n 1))
echo "${output[3]}" | awk -F/ '{printf "%+fms\n", $1-20}'

+修飾子は、printf正か負かに関係なく、符号を印刷するように指示します。

また、を使用しているため、フィールドawkを使用しcutたりbc、フィールドを取得したり、算術演算を実行したりする必要はありません。

于 2013-02-13T19:19:27.040 に答える
0

Bashは浮動小数点数を処理できません。回避策は、次のように使用することawkです。

#!/bin/bash
output=($(ping -qc 1 google.com | tail -n 1))
echo "`cut -d/ -f1 <<< "${output[3]}"`-20" | bc | awk '{if ($1 >= 0) printf "+%fms\n", $1; else printf "%fms\n", $1}'

bcの結果が正でない場合、これは何も出力しないことに注意してください

出力:

$ ./testping.sh 
+18.209000ms
于 2013-02-13T19:14:54.460 に答える
0

`..`非推奨のスタイルコマンド拡張を使用する場合、bashでのエスケープはかなりひどいものです。この場合、バックティックをエスケープする必要があります。つまり、他のエスケープもエスケープする必要があります。$(..)エスケープの別のレイヤーが追加されないため、ネストが大幅に改善されます。

いずれにせよ、私はそれを直接行います:

ping -qc 1 google.com.org | awk -F'[=/ ]+' '{n=$6} 
    END { v=(n-20); if(v>0) printf("+"); print v}'
于 2013-02-13T19:17:22.480 に答える
0

bcの結果を文字列として扱うことができることを認識して、これが私の見解です。

output=($(ping -qc 1 google.com | tail -n 1))
output=$(echo "`cut -d/ -f1 <<< "${output[3]}"`-20" | bc)' ms'
[[ "$output" != -* ]] && output="+$output"
echo "$output"
于 2013-02-13T19:23:01.540 に答える