如何在不拆分已存在的包含空格的参数的情况下向$ @添加参数?

时间:2015-09-03 08:10:20

标签: bash command-line-arguments

我的目标是封装svn命令以提供其他功能。以下是用于执行此操作的函数的最小(非)工作示例:

function custom_svn {
    newargs="$@ my_additional_arg"
    svn $newargs
}

但这不适用于包含空格的参数。例如,当这样调用时:

message="my commit text"
custom_svn ci some_file.txt -m "$message"

SVN尝试提交some_file.txtcommittext,并提供消息" my"而不是只提交some_file.txt消息"我的提交文本"。

我想问题在于错误地使用$ @,但我不确定如何继续保持整个消息。

2 个答案:

答案 0 :(得分:4)

在标准sh中,位置参数是您唯一获得的数组。您可以使用set

追加给他们
set -- "$@" my_additional_arg
svn "$@"

在bash中,您也可以创建自己的自定义数组变量:

newargs=("$@" my_additional_arg)
svn "${newargs[@]}"

当然,正如DigitalRoss所回答的那样,在您的具体示例中,您可以完全避免使用变量,但我猜测您的示例有点过于简单。

答案 1 :(得分:1)

这样做:

svn "$@" my_additional_arg

问题在于构造"$@"仅在确切的形式中是特殊的。

有趣的是,这带来了shell编程的整体优点和坏处。因为它是一个宏处理器,所以在bash中编写简单的东西比在完整语言中编写简单的东西要容易得多。但是,编写复杂的东西更难,因为每次尝试深入抽象时,都需要更改代码以在新的评估级别中正确扩展宏。