set -euxopipelinefailの後、awk変数はバインド解除されます。

set -euxopipelinefailの後、awk変数はバインド解除されます。
PORT=3306
mysql_status=`netstat -nltp |grep mysqld |awk -v port="$PORT" '{if (match($4,/:.+'"$port"'/)) {print "Yes"} }'`

シェル環境について質問があります。私はawkを使用してmysqlリスニングステータスをフィルタリングしています。ここで変数を使用してシェル変数を受け入れています。ある時

set -euxo pipefail 

スクリプトの始めに。エラーがあります。

ポート:バインドされていない変数

しかし、コメントすると、set -euxo pipefailコマンドは正しく機能します。この問題をどのように解決できますか?私は本当にスクリプトでset -euxopipelinefailを使用したいと思います。

答え1

Awkカスタム変数を使用しようとすると、論理が正しくありませんport。正規表現の比較では、次のように~演算子を直接使用できます。match()ここもgrep役に立たない

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

エラーが発生する理由は周辺参照拡張が正しくないためでありport、シェルはこれを未定義変数と解釈し、 で定義-uされているのでset未定義変数に対してエラーを発生させます。

また、バックティックへの「コマンドの置き換え」は廃止され、エラーが発生しやすいです。代わりにその$(..)設定を使用してください。

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

関連情報