我有一个bash脚本,其函数没有按照我认为的那样从函数返回。
如果主机响应3个ping中的任何一个 - 它应该以返回码0退出该函数 - 否则它将退出循环并退出返回码1.
我觉得令人困惑的是跟踪显示执行返回0 - 但实际上并没有这样做。
我还尝试用第二个while循环包装ping,内部“while”有一个break 2但是也没有按预期工作。
我错过了什么?
#!/bin/bash
pingCheck() {
ping -c 3 -W 1 $1 2>&1 | grep --line-buffered time= | while read a; do
return 0
done
return 1
}
set -x
pingCheck note5 || exit
...
以下是可达主机的跟踪输出
+ ping -c 3 -W 1 note5
+ grep --line-buffered time=
+ read a
+ return 0
+ return 1
+ exit
这是跟踪输出到不可到达的主机(按预期工作)
+ ping -c 3 -W 1 note5x
+ grep --line-buffered time=
+ read a
+ return 1
+ exit
答案 0 :(得分:4)
return 0
语句与while
循环体相关联,并且因为当bash
中的每个管道部分都在子shell中运行时,return 0
导致子shell执行{ {1}}循环退出,而不是整个函数。
您只需删除while
部分,然后使用while
:
grep -c
在pingCheck() {
num_res=$(ping -c 3 -W 1 "$1" 2>&1 | grep -c --line-buffered time=)
if [ "$num_res" -ne 0 ]; then
return 0
else
return 1
fi
}
和zsh
等一些shell中,管道的最后一部分是在当前shell中运行的,因此您的函数将在这些shell中运行。
答案 1 :(得分:1)
或删除除ping之外的所有内容:
pingCheck() {
if ping -c 3 -W 1 $1 2>&1 ; then
return 0
else
return 1
fi
}
如果您只是对3次成功的ping感兴趣而没有输出并且成功时返回0
而失败时返回1
,那么:
pingCheck() {
if ping -c 3 -W 1 $1 >/dev/null 1>&2 ; then
return 0
else
return 1
fi
}
注意:提出的观点很好。仅使用ping
将导致第一次失败的返回。因此,这将确认3
成功ping,或者3中的1个失败。