0

我有一个小的 bash 文件,我打算用它来确定我当前的 ping 与我的平均 ping。

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

这会输出我的 ping - 20 ms,这是我想要的数字。但是,如果数字是正数,我还想在前面加上+“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}'

in的+修饰符printf告诉它打印符号,无论是正的还是负的。

并且由于我们使用awk,因此无需使用cutorbc获取字段或进行算术运算。

于 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

这是我的看法,认识到 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 回答
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 回答