0

この関数は機能します:

source foo.bash && foo -n "a b c.txt"

問題は、何を試しても、この出力を正確に生成するための最後の行echo "$CMD"(または)を取得できなかったことです。echo $CMD

cat -n "a b c.txt"

それを達成する方法は?

# foo.bash
function foo() {
    local argv=("$@");
    local OUT=`cat "${argv[@]}"`
    local CMD=`echo cat "${argv[@]}"`
    echo "--------------------------"
    echo "$OUT"
    echo "--------------------------"
    echo "$CMD"
}

代わりに、出力は次のとおりです。

cat -n a b c.txt

このコマンドfoo -n \"a b c.txt\"を使用すると、コマンドの表示には機能しますが、バックティックを介した実行でエラーが発生します。

このファイル"a b c.txt"は、有効な小さなテキストファイルです。

4

2 に答える 2

0

割り当て内の引用符をエスケープする必要があります。

local CMD="cat \"${argv[@]}\""

また、文字列を連結するためにエコーは必要ありません。

于 2012-08-11T19:19:58.090 に答える
0

さて、bash変数のトークン数の助けを借りて、私は正しい解決策を思いつきました。

1 つの引数に対して実際に引用が必要な理由をほとんど忘れていました。複数の単語が含まれているからです。

function foo() {
    local argv=( "$@" );
    local OUT=`cat "${argv[@]}"`
    echo "--------------------------"
    echo "$OUT"
    echo "--------------------------"
    local CMD="cat"
    for word in "${argv[@]}"; do
        words="${word//[^\ ]} "
        if [[ ${#words} > 1 ]]; then
            local CMD="$CMD \"${word}\""
        else
            local CMD="$CMD $word"
        fi
    done
    echo "$CMD"
}

それが誰かを助けることを願っています。

于 2012-08-11T20:18:07.800 に答える