将命令作为变量替换到 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)}}'

由于您不需要 shell 进行任何预扩展,因此最好使用单引号以保持安全。如果使用双引号,则 例如$2将由 shell 预先扩展为参数扩展,这对于 shell 特有的任何其他标记都是如此。

$AWK当您使用它来禁用 split+glob 运算符时,不要忘记引用:

… | awk "$AWK"

相关内容