$ *和$ @的内部处理是什么

时间:2010-12-20 15:33:47

标签: shell unix scripting ksh

实际上,我完全理解$ *和$ @的使用。

例如,如果我使用:my_script *

运行脚本

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

但是,如果在$ *中使用ONE_FILE,则故事会有所不同 我想你们了解其中的差异,我不需要更进一步。

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

例如,当ksh看到my_script *
时 ,它是否将文件名逐个放入数组中,
然后将数组[1] [2] [3] ...放入$ @进行处理?
而且,当看到$ *时,它是否只是结束了 filename1 + space + filename2 + space + ...?

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

有什么见解?

1 个答案:

答案 0 :(得分:2)

  

例如,当korn shell看到my_script *时,它是否将文件名逐个放入数组中,   然后将数组[1] [2] [3] ...放入$ @进行处理?   并且,当看到$ *时,它是否只是连续   filename1 + space + filename2 + space + ...?

是的,差不多。

这里要实现的一件重要事情是,涉及两个独立的进程:调用shell,它将my_script *扩展为myscript arg1 arg2 arg3,以及获取参数数组的子进程。如果该子流程为ksh(或shbash或类似的shell),则$*只是“get argv [1 ...]作为连接的语法string“while $@是”get argv [1 ...] as a array“的语法。同样重要的是要注意$*$@在引用时仅有显着差异。

在bash中,ksh的表兄弟,这个数组变量的概念实际上已经被推广了。 (也许ksh也这样做了 - 我大约十年没用过ksh了......)

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

[~]$ 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[@]}"实际上为您提供了各个元素。