我的目标是封装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.txt
,commit
和text
,并提供消息" my"而不是只提交some_file.txt
消息"我的提交文本"。
我想问题在于错误地使用$ @,但我不确定如何继续保持整个消息。
答案 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中编写简单的东西比在完整语言中编写简单的东西要容易得多。但是,编写复杂的东西更难,因为每次尝试深入抽象时,都需要更改代码以在新的评估级别中正确扩展宏。