Substitua o comando como variável no script bash

3

Eu preciso substituir uma parte de um comando awk em um script com diferentes casos, a partir disso:

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

para isso:

#!/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)

Mas eu sempre recebo um erro de sintaxe.

    
por Steph 23.08.2016 / 11:36

1 resposta

8

Em uma declaração de variável, qualquer coisa (diferente de expansão de parâmetro / comando / aritmética) dentro de " é tratada literalmente, então quando você faz isso:

var="'foobar'"

$var será expandido para 'foobar' , não foobar .

Então você precisa:

AWK='{if (NR!=1) {print substr($2, 1, length($2)-1)}}'

como você não precisa de pré-expansão por shell, é melhor usar aspas simples para ficar do lado mais seguro. Se você usar aspas duplas, então, por exemplo $2 será expandido antecipadamente pelo shell como expansão de parâmetro, isso é verdadeiro para qualquer outro token que seja especial ao shell.

E não se esqueça de citar $AWK quando você usá-lo para desativar o operador split + glob:

… | awk "$AWK"
    
por 23.08.2016 / 12:05

Tags