2015-06-20 83 views
1

很抱歉,如果它的聲音啞,但我目前正在研究一門考試,申請一份工作(管理的),我瞭解了但沒有太多關於腳本。我可以看到它在結構上與非常相似,我對此有很多疑問。懷疑與循環在Unix的

其中之一是這個循環,它是做什麼的,爲什麼它輸出b*

for var in b* 
    echo $var 
done 

我想這個代碼和終端輸出爲b*,爲什麼這個代碼回答我的文字(在這種情況下,b*)或不別的東西發生嗎?

+0

您顯示的代碼給出了語法錯誤。您省略了所有shell循環所需的'do'。 PHP的行爲並不像一個shell。也許你被'$'前綴所愚弄了:在PHP中,它是變量名的一部分,在bash中,它是一個一元運算符來給出值。所以'$'不是用在bash中的賦值左側,而是用PHP(PHP受Perl和C影響比shell更多)。 – cdarke

回答

0

shell腳本中的for循環從輸入中獲取每個空白分隔的字符串,並將其分配給給定的變量,併爲每個值運行一次代碼。在你的情況下,b*是輸入,而$var是分配的變量。

該shell還將執行擴展上的輸入。基本上,*對文件名的任何部分都起着通配符的作用。所以,如果你有在當前目錄中以B開頭的文件,這些將獲得環繞在:

$ ls 
bean.java bean.class readme.txt 
$ for var in b*; do echo $var; done 
bean.java 
bean.class 

然而,如果你沒有任何文件以B開頭(讓您的模式b*不匹配任何東西)該模式將保持不擴展:

$ rm bean.* 
$ ls 
readme.txt 
$ for var in b*; do echo $var; done 
b* 
+0

哦,我明白了,這很有道理。 當終端只回答我「b *」時,我認爲它就像Java中的String值。 非常感謝。永遠不要學習太遲。 –

+2

雖然你應該引用這個變量, echo「$ var」'帶雙引號。 – tripleee

+1

...並且,因爲你在教導globbing,所以使用'echo *'而不是'ls'。 – cdarke