BASH:不能在函数内使用变量

问题描述 投票:0回答:2

在我的函数中,我定义了一个变量:CHECKRESULT:

function checkport {
if nc -zv -w3 $1 $2 <<< '' &> /dev/null
then
    echo -e "TCP-Port $1/$2 is open"
    CHECKRESULT="ok"
else
    echo -e "TCP-Port $1/$2 is closed" 
    CHECKRESULT="error"
fi
}

在脚本的后面,我有一个使用 CHECKRESULT 变量的 if 语句:

if ssh -q $host-- "$(declare -f checkport); checkport $someotherhost ${Ports[$i]} &> /dev/null" && [ "$CHECKRESULT" == "ok" ]

不幸的是,$CHECKRESULT 变量似乎总是“ok”。即使我的函数失败,变量也不会更新为“错误”。

我相信这是因为该函数是通过远程主机上的 ssh 执行的,本地计算机不会获得定义的变量中的结果。

我需要获取变量吗?或者我该如何解决这个问题?

bash function variables
2个回答
0
投票

你的函数总是退出,0表示成功:

function checkport {
if nc -zv -w3 $1 $2 <<< '' &> /dev/null
then
    echo -e "TCP-Port $1/$2 is open"
    CHECKRESULT="ok"
else
    echo -e "TCP-Port $1/$2 is closed" 
    CHECKRESULT="error"
    # missing return 1
fi
 # always returns 0 by default on end of function
}

你需要你的功能来打印任何东西吗?只是:

if ssh -q $host -- nc -zv -w3 $1 $2 <<<'' &> /dev/null; then
   CHECKRESULT="ok"
else
   CHECKRESULT="error"
fi

如果你想要你的函数,让你的函数失败退出 - 在错误路径上添加缺少的

return 1


0
投票

无论是否通过 ssh 调用它,请避免使用全局变量在函数和调用代码之间共享信息,因为这会破坏封装。将

checkport
写为:

checkport() {
    local state=closed result=1

    if nc -zv -w3 "$1" "$2" <<< '' &> /dev/null
    then
        state=open
        result=0
    fi

    printf 'TCP-Port %s/%s is %s\n' "$1" "$2" "$state"
    return "$result"
}

或者,如果您出于某种原因不想使用退出状态,那么:

checkport() {
    local state=closed result=error

    if nc -zv -w3 "$1" "$2" <<< '' &> /dev/null
    then
        state=open
        result=ok
    fi

    printf 'TCP-Port %s/%s is %s\n' "$1" "$2" "$state" >&2
    printf '%s\n' "$result"
}

或:

    printf 'TCP-Port %s/%s is %s\n' "$1" "$2" "$state"
    printf '%s\n' "$result" >&2

或:

    printf 'TCP-Port %s/%s is %s\n' "$1" "$2" "$state"
    printf '%s\n' "$result"

或类似的(无论哪一个最适合您的需求 - 将状态或结果重定向到 stderr 或将两者打印到 stdout 或 stderr),然后编写调用代码来使用它,例如如果您使用上面第一个使用退出状态的脚本:

if state=$(checkport "$someotherhost" "${Ports[$i]}"); then
    do success stuff
else
    do failure stuff
fi

作为一个额外的好处,它将解决您当前的问题,因为您不再在函数内的一台机器上设置全局变量并尝试由其外部的另一台机器读取。

© www.soinside.com 2019 - 2024. All rights reserved.