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[@]}\""

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

于 2012-08-11T19:19:58.090 回答
0

好了,借助bash 变量中的令牌数量,我想出了正确的解决方案。

我几乎忘记了为什么我们实际上需要引用一个论点,因为它有多个词!

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 回答