构建包含空格的参数列表

15 浏览
0 Comments

构建包含空格的参数列表

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

foo "一个字符串"

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

bar() {
    foo "$@"
}
bar "一个字符串"

到目前为止都很好,但是如果我想在调用foo之前操作参数怎么办?

这种方式不起作用:

bar() {
    for arg in "$@"
    do
        args="$args \"前缀 $arg\""
    done
    # 一切看起来都很好...
    echo $args
    # ...但实际上并不是。
    foo $args
    # foo "$args"只是愚蠢
}
bar a b c

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

0
0 Comments

在Bash中使用数组是解决这个问题的方法之一。然而,有一个问题是很难将数组作为参数传递给函数。为了解决这个问题,需要对数组进行引用并将它们作为常规参数传递给函数。

0
0 Comments

问题的出现原因:

在代码中,使用了shift命令来移除参数列表中的第一个参数。但是在代码中,shift命令没有被正确使用,应该是dir=$1; shift

解决方法:

shift命令修改为dir=$1; shift,即可解决该问题。修改后的代码如下:

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

经过修正后,代码将正确地移除参数列表中的第一个参数。

0
0 Comments

问题的原因是,当需要将带有空格的参数传递给一个函数时,参数会被解析为多个独立的参数,而不是作为一个整体。这导致函数无法正确处理带有空格的参数。

解决方法之一是使用数组,并使用"${array[@]}"来扩展数组。在这种方法中,我们将参数存储在一个数组中,并使用循环遍历每个参数。在循环中,我们将每个参数添加到数组中,并在参数前添加一个前缀。最后,我们使用"${args[@]}"将数组传递给另一个函数。

另一种解决方法是使用eval。在这种方法中,我们仍然使用循环遍历每个参数,并将每个参数添加到一个字符串中。但是,不同于数组方法,我们将参数用双引号引起来,并在参数前添加一个前缀。然后,我们使用eval函数来执行带有前缀的参数。

总结起来,解决这个问题的两种方法都是通过遍历参数并添加前缀的方式来处理带有空格的参数。其中一种方法使用数组来存储参数,另一种方法使用字符串和eval函数来处理参数。通过这些方法,我们可以正确地传递带有空格的参数给函数。

0