shell脚本中的$@和$*之间有什么区别?

shell脚本中的$@和$*之间有什么区别?,shell,scripting,Shell,Scripting,在shell脚本中,$@和$*之间有什么区别 获取脚本参数的首选方法是哪种 不同的shell解释器在这方面是否存在差异?来自: $@的行为与$*类似,只是在引用参数时,如果参数中有空格,则这些参数会被正确分解 以这个脚本为例(摘自链接答案): 给出了: $ sh test.sh 1 2 '3 4' 1 2 3 4 现在将$@更改为$*: for var in $* do echo "$var" done 你会发现: $ sh test.sh 1 2 '3 4' 1 2 3 4 (通

在shell脚本中,
$@
$*
之间有什么区别

获取脚本参数的首选方法是哪种

不同的shell解释器在这方面是否存在差异?

来自:

$@的行为与$*类似,只是在引用参数时,如果参数中有空格,则这些参数会被正确分解

以这个脚本为例(摘自链接答案):

给出了:

$ sh test.sh 1 2 '3 4'
1
2
3 4
现在将$@更改为$*:

for var in $*
do
    echo "$var"
done
你会发现:

$ sh test.sh 1 2 '3 4'
1
2
3
4

(通过使用)

和$@找到答案每个参数都是带引号的字符串。否则,其行为相同

请参阅:

与我的POV的一个关键区别是“$@”保留了原始数字 争论不休。这是唯一能做到的形式。正因为如此 在脚本中传递参数非常方便

例如,如果文件my_脚本包含:

#!/bin/bash

main()
{
   echo 'MAIN sees ' $# ' args'
}

main $*
main $@

main "$*"
main "$@"

### end ###
我是这样运行的:

my_script 'a b c' d e
我将获得以下输出:

主视图显示5个参数

主视图显示5个参数

主参数1 args


MAIN可以看到3个参数

“$*”
还有一个有趣的属性。每个参数都由值
$IFS
分隔,而不是用空格分隔。也许有必要解释一下替换结果是如何扩展的(之后的命令是什么样子)以及为什么会导致不同的结果。“是带引号的字符串吗?”?这意味着使用
“$@”
首先生成一个带引号的字符串,然后shell在决定如何运行下一个命令时对其进行解析。更准确的说法是,
$*
完成的字符串连接被跳过,当使用
$*
时,字符串拆分也被跳过。因此,使用
“$@”
不仅通常更正确,而且shell解释的工作量也更少……顺便说一下,引用
!abs
inirc://irc.freenode.org/#bash --除非您知道如何过滤掉垃圾,否则应该避免使用臭名昭著的“高级”Bash脚本指南。它会教你写bug,而不是脚本。因此,BashGuide编写为:From:,变量$@是所有参数$1。。无论什么变量$*,类似,但不保留任何空格和引号,因此“带空格的文件”变为带空格的“文件”。
my_script 'a b c' d e