【问题标题】:What is the internal processing of $* and $@$*和$@的内部处理是什么
【发布时间】:2010-12-20 15:33:47
【问题描述】:

其实我完全理解$*和$@的用法。

例如,如果我使用以下命令运行脚本:my_script *

那么,对于 $@ 中的 ONE_FILE,将真正将每个文件放入 ONE_FILE 中进行处理。
即使文件名中有空格,ONE_FILE 也会得到正确的文件名。

但是,如果在 $* 中使用 for ONE_FILE,情况就不同了。
我想你们理解其中的区别,我不需要更进一步。

现在,我感兴趣的是如何。
KornShell (ksh) 如何解释 my_scrpt *
然后将文件名正确传递到 $@
并将文件名传递给 $*.

例如,当 ksh 看到 my_script *
,它是否将文件名一一放入数组中,
然后将数组[1][2][3]...放入$@进行处理?
而且,当看到 $* 时,它只是 concat
文件名1+空格+文件名2+空格+...?

我知道这可能更多地与 ksh 的内部编码有关。

有什么见解吗?

【问题讨论】:

    标签: shell unix scripting ksh


    【解决方案1】:

    例如,当 korn shell 看到 my_script * 时,它是否将文件名一一放入数组中, 然后将数组[1][2][3]...放入$@进行处理? 而且,当看到 $* 时,它只是 concat 文件名1+空格+文件名2+空格+...?

    是的,差不多。

    这里要意识到的一件重要的事情是涉及两个独立的进程:调用shell,它将my_script * 扩展为myscript arg1 arg2 arg3,以及获取参数数组的子进程。如果该子进程是ksh(或shbash 或类似的shell),那么$* 只是“get argv[1...] as a concatenated string”的语法,而$@ 是语法对于“将 argv[1...] 作为数组获取”。还需要注意的是,$*$@ 只有在引用时才有意义。

    在 ksh 的表亲 bash 中,这种数组变量的思想实际上已经被普遍化了。 (也许 ksh 也这样做了——我已经有大约十年没有使用 ksh 了……)

    在 bash 中,这会创建一个包含 3 个元素的数组,称为 a。请注意,第一个元素包含一个空格:

    [~]$ a=("foo bar" baz quux)
    [~]$ for i in ${a[*]}; do echo $i; done
    foo
    bar
    baz
    quux
    [~]$ for i in ${a[@]}; do echo $i; done
    foo
    bar
    baz
    quux
    [~]$ for i in "${a[*]}"; do echo $i; done
    foo bar baz quux
    [~]$ for i in "${a[@]}"; do echo $i; done
    foo bar
    baz
    quux
    

    从示例中可以看出,"${a[*]}" 连接数组,而"${a[@]}" 实际上为您提供了单个元素。

    【讨论】:

    • +1。顺便说一句,您的演示在 ksh93 中的工作方式相同(可能也是 ksh88)。
    • 谢谢劳伦斯!这听起来很有趣。你能指导我一些网站,以便我可以更深入地研究这个主题吗?
    • 谢谢劳伦斯!这听起来很有趣。是的,一个进程将 * 解释为数组元素,而另一个进程使用数组元素解释“$*”和“$@”是非常合理的。我认为数组元素应该以某种类似于调用 argc 和 argv 的 C 程序方法的方式存储。你能指导我一些网站,以便我可以更深入地研究这个主题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2018-06-12
    • 1970-01-01
    • 2016-04-26
    相关资源
    最近更新 更多