set -euxo pipelinefail 后 awk 变量变为未绑定

set -euxo pipelinefail 后 awk 变量变为未绑定
PORT=3306
mysql_status=`netstat -nltp |grep mysqld |awk -v port="$PORT" '{if (match($4,/:.+'"$port"'/)) {print "Yes"} }'`

我有一个关于 shell 环境的问题。我使用 awk 来过滤mysql监听状态,其中我使用变量接受 shell 变量。当有

set -euxo pipefail 

在脚本的开头。存在错误。

端口:未绑定变量

但当我评论时,该set -euxo pipefail命令运行良好。我该如何解决这个问题。我真的想在脚本中使用 set -euxo pipelinefail 。

答案1

您的逻辑Awk不正确,在某种程度上您尝试使用用户定义的变量port。对于正则表达式比较,您可以直接使用~运算符而不是match()如下所示。这里也是grep没用的

netstat -nltp | awk -v port="$PORT" '/mysqld/ && $4 ~ port { print "Yes" }'

至于错误的原因,是因为 周围的引用扩展不正确port,shell 将其解释为未定义的变量,并且因为-u是在 中定义的set,所以它会针对未定义变量的情况抛出错误。

另外,反引号的 `` 命令替换已经过时并且容易出错,请使用该$(..)结构

mysql_status=$(netstat -nltp | awk -v port="$PORT" '/mysqld/ && $4 ~ port { print "Yes" }')

相关内容