将命令作为变量替换为 bash 脚本

Ste*_*eph 3 bash awk

我需要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)}}')
Run Code Online (Sandbox Code Playgroud)

对此:

#!/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)
Run Code Online (Sandbox Code Playgroud)

但我总是收到语法错误。

hee*_*ayl 8

在变量声明中,里面的任何东西(除了参数/命令/算术扩展)"都是按字面处理的,所以当你这样做时:

var="'foobar'"
Run Code Online (Sandbox Code Playgroud)

$var将扩展为'foobar',而不是foobar

所以你需要:

AWK='{if (NR!=1) {print substr($2, 1, length($2)-1)}}'
Run Code Online (Sandbox Code Playgroud)

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

并且$AWK在使用它禁用 split+glob 运算符时不要忘记引用:

… | awk "$AWK"
Run Code Online (Sandbox Code Playgroud)