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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析/传递命令行参数到bash脚本 - “$ @”和“$ *”之间有什么区别?相关的知识,希望对你有一定的参考价值。

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

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

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

我目前使用的脚本是:

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

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

所以现在我已经永远漫步,我的问题相对简单:

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

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

答案

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

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

另一答案

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

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

另一答案

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

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

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

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

以上是关于解析/传递命令行参数到bash脚本 - “$ @”和“$ *”之间有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章

BASH - 如果没有命令行参数作为参数传递,则抛出使用警告

Bash参数解析逻辑陷入无限循环[重复]

在 Bash 中解析命令行参数的最佳方法是啥?

sh 简单的bash shell脚本模板。有两个版本:1)简单的基于env var的选项,以及2)添加了命令行参数解析

将可变数量的 bash 命令行参数传递给 MATLAB 函数

Bash脚本不处理传递的输入参数[重复]