构建包含空格的参数列表

tar*_*ius 9 bash whitespace arguments

在bash中,可以转义包含空格的参数.

foo "a string"
Run Code Online (Sandbox Code Playgroud)

这也适用于命令或函数的参数:

bar() {
    foo "$@"
}

bar "a string"
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很好,但是如果我想在调用之前操纵参数foo呢?

这不起作用:

bar() {
    for arg in "$@"
    do
        args="$args \"prefix $arg\""
    done

    # Everything looks good ...
    echo $args

    # ... but it isn't.
    foo $args

    # foo "$args" would just be silly
}

bar a b c
Run Code Online (Sandbox Code Playgroud)

那么当参数包含空格时,如何构建参数列表?

tar*_*ius 20

有(至少)两种方法可以做到这一点:

  1. 使用数组并使用"${array[@]}"以下命令展开它:

    bar() {
        local i=0 args=()
        for arg in "$@"
        do
            args[$i]="prefix $arg"
            ((++i))
        done
    
        foo "${args[@]}"
    }
    
    Run Code Online (Sandbox Code Playgroud)

    所以我们学了什么?"${array[@]}"${array[*]}什么"$@"$*.

  2. 或者,如果您不想使用数组,则需要使用eval:

    bar() {
        local args=()
        for arg in "$@"
        do
            args="$args \"prefix $arg\""
        done
    
        eval foo $args
    }
    
    Run Code Online (Sandbox Code Playgroud)


Jae*_*aen 7

这是一个较短的版本,不需要使用数字索引:

(示例:构建命令的参数find

dir=$1
shift
for f in "$@" ; do
    args+=(-iname "*$f*")
done
find "$dir" "${args[@]}"
Run Code Online (Sandbox Code Playgroud)