转义sh/bash函数参数

转义sh/bash函数参数,bash,shell,sh,Bash,Shell,Sh,我想向shell函数提交多个带参数的命令,并引用我的命令,如his: $ CMD=''\''CMD'\'' '\''ARG1 ARG2 ARG3'\''' $ echo $CMD 'CMD' 'ARG1 ARG2 ARG3' 'ARG4' 现在,当我尝试在这样的函数中使用它们时: $ function execute { echo "$1"; echo "$2"; echo "$3"; } 我得到的结果是: $ execute $CMD 'CMD' 'ARG1 ARG2 我如何才能得到这个

我想向shell函数提交多个带参数的命令,并引用我的命令,如his:

$ CMD=''\''CMD'\'' '\''ARG1 ARG2 ARG3'\'''
$ echo $CMD
'CMD' 'ARG1 ARG2 ARG3' 'ARG4'
现在,当我尝试在这样的函数中使用它们时:

$ function execute { echo "$1"; echo "$2"; echo "$3"; }
我得到的结果是:

$ execute $CMD
'CMD'
'ARG1
ARG2
我如何才能得到这个结果:

$ execute $CMD
CMD
ARG1 AGR2 ARG3
提前谢谢

PS:我使用一个取消引用函数,如:

function unquote { echo "$1" | xargs echo; }
编辑:

为了让我的意图更清楚:我想逐步建立一个命令,该命令需要将带有空格的参数传递给子函数:

$ CMD='HOST '\''HOSTNAME'\'' '\''sh SCRIPTNAME'\'' '\''MOVE '\''\'\'''\''/path/to/DIR1'\''\'\'''\'' '\''\'\'''\''/path/to/DIR2'\''\'\'''\'''\'''
$ function execute { echo "$1 : $2 : $3 : $4"; }
$ execute $CMD
HOST : 'HOSTNAME' : 'sh : SCRIPTNAME'

第三个参数在空格处意外中断,引用被忽略

在双引号中使用数组和@:

function execute () {
    echo "$1"
    echo "$2"
    echo "$3"
}

CMD=('CMD' 'ARG1 ARG2 ARG3' 'ARG4')
execute "${CMD[@]}"

在双引号中使用数组和@:

function execute () {
    echo "$1"
    echo "$2"
    echo "$3"
}

CMD=('CMD' 'ARG1 ARG2 ARG3' 'ARG4')
execute "${CMD[@]}"

choroba,这其实很好,但我不知道如何在我的案例中实现这一点。我正在逐步建立我的命令,并向其附加和前置选项。我也在嵌套它们,这就是为什么我需要使用双引号(我写的不是转义)。关于引用失败的原因以及如何规避它的任何提示?引用失败是因为引用根本没有嵌套。这就是为什么在
bash
和几乎所有其他扩展POSIX规范的shell中都引入了数组。@jlue实现所需功能的唯一正确方法是使用本文所示的数组。请阅读有关数组的更多信息(如何附加和前置元素,如何连接两个数组)。这是唯一简单安全的方法!choroba,这其实很好,但我不知道如何在我的案例中实现这一点。我正在逐步建立我的命令,并向其附加和前置选项。我也在嵌套它们,这就是为什么我需要使用双引号(我写的不是转义)。关于引用失败的原因以及如何规避它的任何提示?引用失败是因为引用根本没有嵌套。这就是为什么在
bash
和几乎所有其他扩展POSIX规范的shell中都引入了数组。@jlue实现所需功能的唯一正确方法是使用本文所示的数组。请阅读有关数组的更多信息(如何附加和前置元素,如何连接两个数组)。这是唯一简单安全的方法!perreal,这也很好,但我的问题是,在我的示例中引用失败(是的,它没有逃逸)。有没有关于如何做到这一点的线索?我实际上还在嵌套commands.perreal,这也很好,但我的问题是,在我的示例中引用失败(是的,它没有转义)。有没有关于如何做到这一点的线索?我实际上还在嵌套这些命令。
CMD1 receives ARG11 ARG12 ARG13
CMD2 receives ARG21 ARG22 ARG23