解析/传递命令行参数到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 - 如果没有命令行参数作为参数传递,则抛出使用警告
sh 简单的bash shell脚本模板。有两个版本:1)简单的基于env var的选项,以及2)添加了命令行参数解析