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