1

引数付きの複数のコマンドをシェル関数に送信したいので、コマンドを彼のように引用します。

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

3 番目の引数は予期しないスペースで中断され、引用符は無視されます。??

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 に答える