bash脚本中$ @和$*之间的差异

rua*_*hao 15 linux bash shell

下面有4个bash片段.我打电话给他们./script.sh a b c

for arg in $@; do 
echo "$arg"
done   ## output "a\nb\nc"

for arg in "$@"; do
echo "$arg"
done  ## output "a\nb\nc" -- I don't know why

for arg in $*; do
echo "$arg"
done  ##    output "a\nb\nc"

for arg in "$*"; do
echo "$arg"
done    ## output "abc"
Run Code Online (Sandbox Code Playgroud)

我不知道什么是之间准确的区别$@$*,
我想"$@""$*"应该是一样的,但事实并非如此.为什么?

mil*_*ose 27

如果你有一个脚本foo.sh:

asterisk "$*"
at-sign "$@"
Run Code Online (Sandbox Code Playgroud)

并称之为:

./foo.sh "a a" "b b" "c c"
Run Code Online (Sandbox Code Playgroud)

它相当于:

asterisk "a a b b c c"
at-sign "a a" "b b" "c c"
Run Code Online (Sandbox Code Playgroud)

没有引号,它们是相同的:

asterisk $*
at-sign $@
Run Code Online (Sandbox Code Playgroud)

相当于:

asterisk "a" "a" "b" "b" "c" "c"
at-sign "a" "a" "b" "b" "c" "c"
Run Code Online (Sandbox Code Playgroud)

  • +1说明性示例比抽象描述更有帮助. (3认同)

Cha*_*ens 7

$*和$ @之间的区别是::

"$*" All the positional parameters (as a single word) *

"$@" All the positional parameters (as separate strings)

如果使用./my_c $ @将给予bash脚本的三个命令行参数传递给C程序,

你得到了结果 ARG[1] == "par1" ARG[2] == "par2" ARG[3] == "par3"

如果使用./my_c $*将给予bash脚本的三个命令行参数传递给C程序,

你得到了结果 ARG[1] == "par1 par2 par3"