【问题标题】:Difference between $* and $@ in Bash [duplicate]Bash中$ *和$@之间的区别[重复]
【发布时间】:2016-05-06 01:30:43
【问题描述】:

谁能提供一个shell脚本示例来说明$*$@之间的区别?

以下是我的脚本,但是看不出区别。谁能举个例子?

$ cat internalVar.sh 
#!/bin/bash
# internalVar.sh var1 var2
echo "\$? = " $?
export IFS="_"
echo "\$@ = " $@ " == several parameters?"
j=1
for i in $@
do
    echo "var $j = $i"
    j=$((j+1))
done
echo "\$* = " $* " == a single string"
j=1
for i in $*
do
    echo "var $j = $i"
    j=$((j+1))
done
echo "\$# = " $#
echo "\$0 = " $0
echo "\$$ = " $$


$ export IFS="c"
[$ ./internalVar.sh par1 "par meter 2" par3
$? =  0
$@ =  par1 par meter 2 par3  == several parameters?
var 1 = par1
var 2 = par meter 2
var 3 = par3
$* =  par1 par meter 2 par3  == a single string
var 1 = par1
var 2 = par meter 2
var 3 = par3
$# =  3
$0 =  ./internalVar.sh
$$ =  4638

【问题讨论】:

  • 您的脚本无法区分,因为它没有使用适当的引号。如果没有正确引用,没有没有区别(并且您会遇到很多错误)。
  • @CharlesDuffy Duh,当然有副本。我一定以为“这不是在问var = val,它一定是新的;)
  • 谢谢大家,我明白了。

标签: bash shell


【解决方案1】:

这个怎么样:

$ set 'arg1a arg1b' 'arg2a arg2b' 'arg3a arg3b'
$ for arg in "$@"; do echo "$arg"; done
arg1a arg1b
arg2a arg2b
arg3a arg3b
$ for arg in "$*"; do echo "$arg"; done
arg1a arg1b arg2a arg2b arg3a arg3b
$ for arg in $@; do echo "$arg"; done
arg1a
arg1b
arg2a
arg2b
arg3a
arg3b
$ for arg in $*; do echo "$arg"; done
arg1a
arg1b
arg2a
arg2b
arg3a
arg3b

这会循环展开,在第一种情况下"$@" 是每个位置参数的单独参数,在第二种情况下"$*" 是单个字符串。

第三种和第四种情况,不加引号的情况,进行分词,彼此没有区别。

另见the manual,“特殊参数”。

【讨论】:

    猜你喜欢
    • 2018-08-26
    • 2015-02-12
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 2021-12-17
    • 2017-04-26
    相关资源
    最近更新 更多