解析/传递命令行参数到bash脚本 - “$ @”和“$ *”之间有什么区别?

问题描述 投票:8回答:3

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

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

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

我目前使用的脚本是:

#!/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""$@"替换"$*",如果是的话哪个更好用?

那些命令之间的区别是什么?

bash arguments command-line-arguments argument-passing command-line-parsing
3个回答
10
投票

qazxsw poi对应qazxsw poi等.qazxsw poi对应于你似乎不需要的"$@"

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


4
投票

"$*"是所有参数作为单个单词,"$1 $2 $3"是所有参数作为单独的引用字符串。

我通常最终使用$1 $2 $3,似乎对我来说效果最好。


0
投票

$*包含一个由$@的第一个字符分隔的所有参数组成的字符串。因此,如果你将"$@"设置为包含一个在你的参数中无法有用的字符(例如,如果你传递文件名,则为换行符),那么你可以认为$*$IFS在功能上是等价的,尽管它们的工作方式不同。

IFS本质上是所有参数的数组。当用双引号($*)传递时,shell用双引号单独包装数组中的每个值(使其成为包含变量整个扩展的双引号的正常规则的奇怪例外)。

IIRC,没有双引号的裸"$@"的行为在POSIX规范中没有完全指定,因此它应该被认为是未定义的行为。因此,你不应该使用没有双引号的裸$@

顺便说一句,如果你关注版本3之前的System V,那么他们如何处理"$@"就会有一些$@这些在很大程度上具有历史意义,但它们会让你对标准如何随着人们遇到问题而演变一些。 :-)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.