2010-12-20 90 views
1

的內部處理其實,我完全理解了$ *和$ @的用法。

例如,如果我使用運行該腳本:my_script *

然後,在$ @ ONE_FILE將真正得到每個文件到ONE_FILE進行處理。
即使文件名中有空格,ONE_FILE也會得到正確的文件名。

但是,如果使用$ *中的ONE_FILE,則故事是不同的。
我想你們明白我們之間的差異,我不需要走得更遠。

現在,我感興趣的是如何。
KornShell(ksh)如何解釋my_scrpt *
,然後將文件名正確傳遞到$ @
並將文件名傳遞到$ *。

例如,當看到KSH * my_script
,不是把文件名逐個成陣列,
然後把數組[1] [2] [3] ...到$ @處理?
而且,當看到$ *時,它只是concat
filename1 +空格+文件名2 +空格+ ...?

我知道這可能與ksh的內部編碼更相關。

任何見解?

回答

2

例如,當Korn外殼看到my_script *,它把文件名逐個到一個數組, 然後把數組[1] [2] [3] ...到$ @處理? 而且,當看到$ *時,它是否只是concat 文件名1 +空格+文件名2 +空格+ ...?

是的,非常多。

這裏要實現的一個重要的事情是,涉及兩個獨立的進程:調用shell,它將my_script *擴展爲myscript arg1 arg2 arg3,並獲取獲取參數數組的子進程。如果該子進程是ksh(或sh,bash或類似的shell),則$*只是「get argv [1 ...]作爲連接字符串」的語法,而[email protected]是「get argv [1 ...]作爲一個陣列「。同樣重要的是要注意$*[email protected]只有在引用時纔有意義的不同。

在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[@]}",其實是給予你的單個元素。

+0

+1。順便說一句,你的演示在ksh93中的作用是一樣的(可能也是ksh88)。 – 2010-12-20 19:01:15

+0

謝謝勞倫斯!這聽起來很有趣。你能指導我一些網站,以便我可以深入研究這個主題嗎? – 2010-12-23 15:23:57

+0

謝謝勞倫斯!這聽起來很有趣。是的,一個進程將*解釋爲數組元素而另一個進程使用數組元素解釋「$ *」和「$ @」是非常合理的。我認爲數組元素應該以某種方式存儲,類似於調用argc和argv的C程序方法。你能指導我一些網站,以便我可以深入研究這個主題嗎? – 2010-12-23 15:30:16