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

관련 정보