【问题标题】:Difference between "$@" and "$*" when passing arguments to bash function [duplicate]将参数传递给bash函数时“$@”和“$*”之间的区别[重复]
【发布时间】:2016-03-07 13:02:15
【问题描述】:

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

示例如下:

function a {
    echo "-$1-" "-$2-" "-$3-";
}

function b {
    a "$@"
}

function c {
    a "$*"
}

如果调用:

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

打印出来:

-hello world- -bye world- -xxx-

如果调用:

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

打印出来:

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

发生了什么?我无法理解差异和出了什么问题。

【问题讨论】:

  • "$@" 字符串的数量与参数的数量一样多; "$*" 是一个字符串。有很多问题涵盖了这一点——我很快就会找到一个。
  • 感谢@JonathanLeffler,这是一本很好的阅读材料。

标签: bash shell command-line arguments parameter-passing


【解决方案1】:

$*$@ 之间没有区别。它们都导致参数列表被全局扩展和分词,因此您不再对原始参数有任何想法。你几乎不会想要这个。

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

"$@" 每个参数生成一个字符串,既不分词也不扩展。这通常是您想要的。

【讨论】:

    猜你喜欢
    • 2016-10-18
    • 2011-05-02
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2021-10-05
    • 2011-03-11
    相关资源
    最近更新 更多