14

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

foo "a string"

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

bar() {
    foo "$@"
}

bar "a string"

到目前为止一切顺利,但是如果我想在调用之前操纵参数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

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

4

5 回答 5

23

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

  1. 使用数组并使用以下方法扩展它"${array[@]}"

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

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

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

    bar() {
        local args=()
        for arg in "$@"
        do
            args="$args \"prefix $arg\""
        done
    
        eval foo $args
    }
    
于 2009-01-05T00:38:46.760 回答
6

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

find(示例:为命令构建参数)

dir=$1
shift
for f in "$@" ; do
    args+=(-iname "*$f*")
done
find "$dir" "${args[@]}"
于 2013-10-03T19:44:47.990 回答
1

使用数组(Bash中的隐藏功能之一)。

于 2009-01-04T19:51:34.013 回答
0

您可以按照您的建议使用数组,只需更改一个小细节。调用 foo 的行应该是

 foo "${args[@]}"
于 2009-01-06T14:42:52.793 回答
0

我也有这个问题。我正在编写一个 bash 脚本来备份我的 Windows 计算机(cygwin)上的重要文件。我也尝试了数组方法,但仍然有一些问题。不确定我是如何修复它的,但这是我的代码中很重要的部分,以防它对您有所帮助。

WORK="d:\Work Documents\*"
#   prompt and 7zip each file
for x in $SVN $WEB1 $WEB2 "$WORK" $GRAPHICS $W_SQL
do
    echo "Add $x to archive? (y/n)"
    read DO
    if [ "$DO" == "y" ]; then
        echo "compressing $x"
        7zip a $W_OUTPUT "$x"
    fi
    echo ""
done
于 2009-01-06T14:52:26.800 回答