コマンドを変数として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"

関連情報