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" }')