Bash函数返回不如预期

时间:2016-01-09 00:55:58

标签: bash function return

我有一个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

2 个答案:

答案 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个失败。