Bash脚本使用nc检测端口占用的while循环不生效问题排查
问题根因
- 仅在循环启动前读取了一次
$port变量,编辑config.env后没有重新加载配置,变量值始终为初始值,条件判断结果永远不会变化 - 若初始读取的
$port为空或为非法值,nc命令会直接执行异常,无论是否在条件前加!,返回值都会固定,表现为两种写法运行结果一致 nc -z的默认返回规则:目标端口被占用时返回0,端口未被占用时返回非0
修复方案
每次编辑完配置文件后重新读取$port变量即可,修复后的完整脚本示例如下:
# 初始加载配置,获取port变量 # 如果你的配置文件不能直接source,可替换为你自己的读取逻辑,比如 port=$(grep '^PORT=' config.env | cut -d '=' -f2) source config.env # 加-w 2参数设置nc超时时间为2秒,避免无响应卡住 while nc -z -w 2 localhost "$port"; do echo "port $port is already used. Please choose another one." read -p "Press enter to edit configuration file" nano config.env # 编辑完成后重新加载配置,更新port变量 source config.env done echo "port $port is available, script proceed"
内容的提问来源于stack exchange,提问作者Ra Spirit
相关产品推荐
相关产品推荐

