下面有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)
$*和$ @之间的区别是::
"$*" 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"