关于shell:将参数传递给bash函数时“$ @”和“$ *”之间的区别

Difference between “$@” and “$*” when passing arguments to bash function

本问题已经有最佳答案,请猛点这里访问。

我很难理解在将$@$*传递给函数时的区别。

以下是示例:

1
2
3
4
5
6
7
8
9
10
11
function a {
    echo"-$1-""-$2-""-$3-";
}

function b {
    a"$@"
}

function c {
    a"$*"
}

如果呼叫:

1
$ b"hello world""bye world""xxx"

它打印:

1
-hello world- -bye world- -xxx-

如果呼叫:

1
$ c"hello world""bye world""xxx"

它打印:

1
2
$ c"hello world""bye world""xxx"
-hello world bye world xxx- -- --

发生了什么事?我不明白区别和哪里出了问题。


$*$@之间没有区别。这两种方法都会导致参数列表被全局扩展和单词拆分,因此您不再了解原始参数。你几乎不想要这个。

"$*"生成一个字符串,这是所有使用$IFS的第一个字符作为分隔符(默认情况下,是空格)连接的参数。这是你偶尔想要的。

"$@"为每个参数生成一个字符串,单词split和glob都不展开。这通常是你想要的。