我试着检查我的ttl值与别名在.bashrc文件通过这样的函数:
# awk ttl
function awkTTL() {
ping 8.8.8.8 -c 1 | grep 'ttl' | awk -F '[ :=]' '{print $9}'
}
# check connection
function checkOnline() {
awkTTL
if [[ awkTTL -ge 2 ]]; then
echo "online"
else
echo "offline"
fi
}
alias -g ww=checkOnline
我总是得到这样的回答
107 # current ttl value
offline # echo from function
首先,下面的所有内容都假设您的ping
命令的输出格式使您的原始awk可以按原样工作。如果这个假设不成立(并不是所有的ping
命令都适用于此,f/e,我试图测试的一个命令将值放在$10
而不是$9
中),那么下面的示例(除了完全不使用awk的纯bash)也不适用。
checkOnline
函数的更好实现如下:
# caution: this awk code doesn't work for all versions of ping
awkTTL() { ping 8.8.8.8 -c 1 | awk -F '[ :=]' '/ttl/ {print $9}'; }
checkOnline() {
if [[ $(awkTTL) -ge 2 ]]; then
echo "online"
else
echo "offline"
fi
}
使用命令替换($( ... )
语法)意味着我们将运行awkTTL
的输出放入[[
参数列表中,而不是字符串'awkTTL'
。因为字符串'awkTTL'
不是数字,所以尝试将其与数字进行比较失败。
顺便说一下,您也可以在awk中完成整个操作,而不需要bash来读取或比较awk的输出:
# note that this still assumes ttl is in $9, per the OP's original code
checkOnline() {
awk -F '[ :=]' '
BEGIN { ttl=0 }
/ttl/ && $9 ~ /^[[:digit:]]+$/ { ttl=$9 }
END { if (ttl >= 2) { print "online" } else { print "offline" } }
' < <(ping 8.8.8.8 -c1)
}
…或者,在bash中完成全部工作,而不需要awk:
checkOnline() {
local line highestTTL=0
while IFS= read -r line; do
if [[ $line =~ [[:space:]]ttl=([[:digit:]]+)([[:space:]]|$) ]]; then
highestTTL=${BASH_REMATCH[1]}
fi
done < <(ping 8.8.8.8 -c 1)
if (( highestTTL >= 2 )); then
echo "online"
else
echo "offline"
fi
}
awkTTL
在本例中直接回显到控制台,因此您将无法轻松地在if
语句中捕获测试的值。我建议使用awkTTL
函数返回可以被捕获或回显的值:
function awkTTL() {
ping 8.8.8.8 -c 1 | grep 'ttl' | awk -F '[ :=]' '{print $9}'
}
function checkOnline() {
ttl = $(awkTTL) # capture value from the function
echo $ttl
if [[ $ttl -ge 2 ]]; then
echo 'online'
else
echo 'offline'
fi
}
我不知道你的"小号"字符串是从哪里来的。唯一的猜测是,这是从一个以前的版本的脚本正在执行,而不是你发布的那个。