Bash 如何在if条件下使用netcat命令的退出代码?

Bash 如何在if条件下使用netcat命令的退出代码?,bash,exit-code,netcat,Bash,Exit Code,Netcat,我在bash中有这个函数,它使用netcat检查地址上的端口是否打开。例如,我正在使用localhost 3000进行测试 错误 我在运行nc获取错误代码时遇到问题。我一直看到混乱: nc_输出:需要整数表达式 从if条件。(见下面的代码) 代码 #!/bin/bash set -o nounset scan() { local host=$1 local port=$2 local nc_output nc_output=$(nc ${host} ${port} -w 5)

我在bash中有这个函数,它使用netcat检查地址上的端口是否打开。例如,我正在使用localhost 3000进行测试

错误

我在运行
nc
获取错误代码时遇到问题。我一直看到混乱:

nc_输出:需要整数表达式

从if条件。(见下面的代码)

代码

#!/bin/bash
set -o nounset

scan() {
  local host=$1
  local port=$2
  local nc_output

  nc_output=$(nc ${host} ${port} -w 5)
  eval ${nc_output}
  if [ nc_output -ne 0 ]; then
     "PORT ${port} CLOSED on ${host}"
  else
    echo "PORT ${port} OPEN on ${host}"
  fi
}

scan 127.0.0.1 3000

我认为问题在于如何将
nc
命令存储在变量中,以便以后对其进行
eval
操作。你什么时候做的

nc_output=$(nc ${host} ${port} -w 5)
#          ^^                      ^
标记的语法
$(..)
用于
bash
中的命令替换,它在内部运行命令,并将命令的输出存储在所使用的变量中。因此,上面的行运行
nc
命令,并将返回的输出存储在变量
nc\u output
中。请记住,这只存储命令的标准输出,而不存储应从变量
$?
获取的
nc
命令的返回代码

我猜您的意图是将命令存储在一个变量中,然后
eval
一次并获取退出代码,但是
eval
-将
nc
命令返回的输出循环使用,这是不必要的,这是错误的

理想的方法应该是公正

nc "${host}" "${port}" -w 5
nc_exit_code=$?
并在条件中使用此变量

if [ "$nc_exit_code" -ne 0 ]; then
请注意,
$
前缀位于变量名之前。您需要使用
$var
语法来访问shell语法中标识符
var
的值。你没有在原来的帖子中使用这个符号。不这样做会将文本字符串
nc_输出
0
进行比较,这没有意义,因为这两个字符串的本机类型彼此不同

另外,将此退出代码显式存储在变量中是多余的,
if
条件直接作用于返回的命令的退出代码,因此

if ! nc "${host}" "${port}" -w 5; then
    echo "PORT ${port} CLOSED on ${host}"
else
    echo "PORT ${port} OPEN on ${host}"
fi

应足以满足您的逻辑。

如果[“$nc_输出”-ne 0];然后
(注意变量前的美元符号),您将文本字符串
nc_输出
0
比较的是
eval${nc_输出}
应该做什么?“nc输出不是退出代码”是正确的(输出和退出代码是不同的事情),但是这与你的问题有什么关系?@melpomene我正在尝试使用应该运行该命令的
eval${nc_output}
来运行nc命令。这意味着
nc_output
的名称有误<代码>$?是退出代码,而不是输出。