명령을 변수로 bash 스크립트로 대체

명령을 변수로 bash 스크립트로 대체

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쉘에 의해 매개변수 확장으로 미리 확장됩니다. 예를 들어 쉘에 특정한 다른 토큰도 마찬가지입니다.

$AWKSplit+Glob 연산자를 비활성화하기 위해 이것을 사용할 때 인용하는 것을 잊지 마십시오:

… | awk "$AWK"

관련 정보