9

我正在使用 bash 脚本.jar从任何位置调用和执行文件,而无需不断输入其显式路径。

需要在执行时指定额外的.jar变量参数,因为这些可以是任何东西,它们不能硬编码到脚本中。

总共有 3 个变量,第一个指定要执行的 2 个动作中的 1 个.jar,第二个指定要执行此动作的目标文件,第三个指定要创建动作的文件的名称。

我目前使用的脚本是:

#!/bin/bash  
java -jar "C:\path\to\file.jar" "$1" "$2" "$3"

我对 bash 脚本知之甚少,但是在寻找解决我的问题的另一个答案(现已修复)时,我遇到了"$@""$*"引用命令行参数时。做更多的搜索把我带到了这个网站:How To Wiki: How to read command line arguments in a bash script,但我找不到任何关于这些参数的可靠信息,而不必涉足上面的大量高级 bash 编程我的头。

所以现在我已经一直在胡说八道了,我的问题相对简单:

我可以"$1" "$2" "$3""$@"or代替"$*",如果可以的话,哪个更好用?

另外,这些命令之间有什么区别(如果有的话)?

4

3 回答 3

11

"$@"对应于"$1" "$2" "$3"等。"$*"对应于"$1 $2 $3"你似乎不需要的。

没有引号,没有区别,它们都对应$1 $2 $3等。

于 2013-05-20T12:28:40.953 回答
4

$*是将所有参数作为一个单词,$@将所有参数作为单独的引号字符串。

我通常最终使用"$@", 似乎最适合我。

于 2013-05-20T12:33:21.530 回答
0

$*包含由所有参数组成的单个字符串,由 . 的第一个字符分隔$IFS。因此,如果您设置IFS包含一个不能有用地出现在您的参数中的字符(例如,如果您正在传递文件名,则为换行符),那么您可以考虑$*"$@"在功能上等效,尽管它们在引擎盖下的工作方式不同。

$@本质上是所有参数的数组。当传入双引号 ( "$@") 时,shell会用双引号将数组中的每个值单独括起来(使其成为双引号将变量的整个扩展括起来的正常规则的一个奇怪的例外)。

IIRC,$@没有双引号的裸露的行为在 POSIX 规范中没有完全指定,所以它应该被认为是未定义的行为。因此,您永远不应该使用$@没有双引号的裸字符。

顺便说一句,如果您关心版本 3 之前的 System V,那么它们的处理方式存在一些古老的怪癖$@.。 这些在这一点上主要具有历史意义,但它们会让您了解标准在人们遇到问题时是如何演变的. :-)

于 2018-01-08T19:09:36.037 回答