1

我想向 shell 函数提交多个带有参数的命令,从而引用我的命令,如他的:

$ 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'

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

4

2 回答 2

5

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

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

CMD=('CMD' 'ARG1 ARG2 ARG3' 'ARG4')
execute "${CMD[@]}"
于 2013-11-05T11:06:37.683 回答
2
function execute { 
  while [[ $# > 0 ]]; do
      cmd=$(cut -d' ' -f1 <<< $1)
      arg=$(sed 's/[^ ]* //' <<< $1)
      echo "$cmd receives $arg"
      shift
  done
}

CMD1="CMD1 ARG11 ARG12 ARG13"
CMD2="CMD2 ARG21 ARG22 ARG23"
execute "$CMD1" "$CMD2"

给出:

CMD1 receives ARG11 ARG12 ARG13
CMD2 receives ARG21 ARG22 ARG23
于 2013-11-05T11:21:04.747 回答