实际上,我完全理解$ *和$ @的使用。
例如,如果我使用: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的内部编码有关。
有什么见解?
答案 0 :(得分:2)
例如,当korn shell看到my_script *时,它是否将文件名逐个放入数组中, 然后将数组[1] [2] [3] ...放入$ @进行处理? 并且,当看到$ *时,它是否只是连续 filename1 + space + filename2 + space + ...?
是的,差不多。
这里要实现的一件重要事情是,涉及两个独立的进程:调用shell,它将my_script *
扩展为myscript arg1 arg2 arg3
,以及获取参数数组的子进程。如果该子流程为ksh
(或sh
,bash
或类似的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[@]}"
实际上为您提供了各个元素。