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

How to use the exit code of netcat command in a if condition?

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

错误

我无法从 运行 nc 获取错误代码。我一直看到消息:

nc_output: integer expression expected

来自 if 条件。 (请参阅下面的代码)

代码

#!/bin/bash
set -o nounset

scan() {
  local host=
  local port=
  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 命令并将输出 returned 存储在变量 nc_output 中。请记住,这仅存储命令的标准输出, nc 命令的 return 代码应从变量 $?[ 中获取=31=]

我猜你的意图是将命令存储在一个变量中,然后 eval 它一次并获取退出代码,但是你通过 eval-ing 输出做错了return 从 nc 命令编辑,这是迂回且不必要的。

理想的方式应该是

nc "${host}" "${port}" -w 5
nc_exit_code=$?

并在条件中使用此变量

if [ "$nc_exit_code" -ne 0 ]; then

注意变量名前的$前缀。您需要使用 $var 语法来访问 shell 语法中标识符 var 的值。您没有使用原始 post 中的符号。不这样做会将文字字符串 nc_output0 进行比较,这没有意义,因为两者的本机类型彼此不同。

同样将此退出代码显式存储在变量中是多余的,if 条件直接作用于命令 returned 的退出代码,因此只需

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

应该足以满足您的逻辑。