检查函数的结果是否高于某个数字总是假的



我试着检查我的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
}

我不知道你的"小号"字符串是从哪里来的。唯一的猜测是,这是从一个以前的版本的脚本正在执行,而不是你发布的那个。

相关内容

  • 没有找到相关文章

最新更新