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