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

nic*_*laj 52 shell scripting

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

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

不同的shell解释器之间是否存在差异?

Mar*_*ers 62

这里:

$ @的行为类似于$*,但是当引用时,如果参数中有空格,则它们会被正确分解.

以此脚本为例(取自链接的答案):

for var in "$@"
do
    echo "$var"
done
Run Code Online (Sandbox Code Playgroud)

给出这个:

$ sh test.sh 1 2 '3 4'
1
2
3 4
Run Code Online (Sandbox Code Playgroud)

现在"$@"改为$*:

for var in $*
do
    echo "$var"
done
Run Code Online (Sandbox Code Playgroud)

你得到这个:

$ sh test.sh 1 2 '3 4'
1
2
3
4
Run Code Online (Sandbox Code Playgroud)

(通过使用谷歌找到的答案)

  • `"$*"`还有一个有趣的属性.每个参数由值$ $ IFS而不是空格分隔. (14认同)
  • 解释替换最终如何扩展(之后的命令是什么样子)以及为什么会导致不同的结果可能是值得的。 (2认同)

Art*_*wri 14

与我的POV的一个主要区别是"$ @"保留了原始参数数量.这是唯一的形式.因此,使用脚本传递args非常方便.

例如,如果文件my_script包含:

#!/bin/bash

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

main $*
main $@

main "$*"
main "$@"

### end ###
Run Code Online (Sandbox Code Playgroud)

我像这样运行它:

my_script 'a b c' d e
Run Code Online (Sandbox Code Playgroud)

我会得到这个输出:

MAIN看到了5个args

MAIN看到了5个args

MAIN看到1个args

MAIN看到3个args