繁体   English   中英

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

[英]Get the executed command, quoted params, after executing `“${argv[@]}”`

此功能有效:

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 \\"ab c.txt\\"可以在命令显示中使用,但是通过反引号给出了执行错误。

文件"ab c.txt"是有效的小型文本文件。

您需要在作业内部转义引号:

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

同样,不需要echo来连接字符串。

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

希望它可以帮助某人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM