Bash 如何在if条件下使用netcat命令的退出代码?
我在bash中有这个函数,它使用netcat检查地址上的端口是否打开。例如,我正在使用localhost 3000进行测试 错误 我在运行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)
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
的名称有误<代码>$?是退出代码,而不是输出。