在执行“$ {argv [@]}”之后,获取执行的命令,引用params

时间:2012-08-11 19:06:44

标签: linux bash shell

此功能有效:

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"是一个有效的小型文本文件。

2 个答案:

答案 0 :(得分:0)

你需要在作业中转义引号:

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

此外,连接字符串不需要echo。

答案 1 :(得分:0)

number of tokens in bash variable的帮助下,你走了,我找到了正确的解决方案。

我差点忘了为什么我们实际上需要引用一个参数,这是因为它有多个单词!

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"
}

希望它有所帮助。