Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何向$@添加参数,而不拆分包含已有参数的空间?_Bash_Command Line Arguments - Fatal编程技术网

Bash 如何向$@添加参数,而不拆分包含已有参数的空间?

Bash 如何向$@添加参数,而不拆分包含已有参数的空间?,bash,command-line-arguments,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.txt、commit和text,消息

我的目标是封装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
,消息为“我的”,而不是仅提交
some_file.txt
,消息为“我的提交文本”

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

请执行以下操作:

svn "$@" my_additional_arg
问题在于,构造
“$@”
仅在该确切形式中是特殊的

有趣的是,这带来了shell编程的全部优点和缺点。因为它是一个宏处理器,所以用bash编写简单的东西比用全语言编写简单得多。但是,编写复杂的东西要困难得多,因为每次试图深入抽象层次时,都需要更改代码,以便在新的求值层次上正确地扩展宏。

执行以下操作:

svn "$@" my_additional_arg
问题在于,构造
“$@”
仅在该确切形式中是特殊的


有趣的是,这带来了shell编程的全部优点和缺点。因为它是一个宏处理器,所以用bash编写简单的东西比用全语言编写简单得多。但是,编写复杂的东西要困难得多,因为每次尝试深入抽象一层时,都需要更改代码,以便在新的求值级别中正确地扩展宏。

在标准sh中,位置参数是唯一的数组类型。您可以使用
set
附加到它们:

set -- "$@" my_additional_arg
svn "$@"
在bash中,您也可以创建自己的自定义数组变量:

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

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

在标准sh中,位置参数是唯一一种数组。您可以使用
set
附加到它们:

set -- "$@" my_additional_arg
svn "$@"
在bash中,您也可以创建自己的自定义数组变量:

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

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

如果引用了参数,则不会分割包含参数的空间,但它们仍然是空格分隔的,您需要将它们引用为svn的单个参数。如果引用它们,则不会分割包含参数的空间,它们仍然是空格分隔的,您需要将它们引用为svn的单个参数。