awk
스크립트의 명령 일부를 다음과 같은 다른 대소문자로 바꿔야 합니다.
CONTAINER=$1
RESULTS=$(ssh -o LogLevel=QUIET -t -i ~/key.pem user@server sudo docker stats --no-stream $CONTAINER | awk '{if (NR!=1) {print substr($2, 1, length($2)-1)}}')
이와 관련하여:
#!/bin/bash
CONTAINER=$1
TYPE=$2
case "${TYPE}" in
cpu)
AWK="'{if (NR!=1) {print substr($2, 1, length($2)-1)}}'"
;;
esac
RESULTS=$(ssh -o LogLevel=QUIET -t -i ~/key.pem user@server sudo docker stats --no-stream $CONTAINER | awk $AWK)
그런데 계속 구문 오류가 발생합니다.
답변1
변수 선언에서 내부의 모든 항목(매개변수/명령/산술 확장 제외)은 "
문자 그대로 처리됩니다.
var="'foobar'"
$var
로 확장됩니다 . 'foobar'
아니요 foobar
.
따라서 다음이 필요합니다.
AWK='{if (NR!=1) {print substr($2, 1, length($2)-1)}}'
사전 확장을 수행하기 위해 셸이 필요하지 않으므로 안전을 유지하려면 작은따옴표를 사용하는 것이 가장 좋습니다. 큰따옴표를 사용하는 경우 이는 $2
쉘에 의해 매개변수 확장으로 미리 확장됩니다. 예를 들어 쉘에 특정한 다른 토큰도 마찬가지입니다.
$AWK
Split+Glob 연산자를 비활성화하기 위해 이것을 사용할 때 인용하는 것을 잊지 마십시오:
… | awk "$AWK"