2013-12-14 67 views
0

這個腳本中的「eval」是什麼?這是什麼評估?Linux Script混淆

#!/bin/bash  
n=1  
for i `eval echo {1..$1}`  
do  
    n=$((n * i))  
done 
+0

反引號評估表達式; 'eval'評估從1到$ 1(你的函數的參數)擴展的花括號。我認爲只要'我在\'echo {1 .. $ 1} \''中就可以做到這一點。 – Floris

+0

使用'eval'通常是一件壞事。考慮使用'seq'來代替:'for i in \'seq 1 $ 1'';做echo $ i; done'。 – Lynch

回答

2

Eval執行它在其參數中找到的shell命令。您需要這樣做,因爲..運算符要求其參數是文字數字而不是變量。

eval echo {1..$1} 

第一代的$1值到參數作爲正常變量替換的一部分。如果參數爲腳本爲5,這變爲:

eval echo {1..5} 

然後eval執行該命令,所以它執行:

echo 1 2 3 4 5 

由於這是所有內部反引號,所述echo的輸出被取代的進入for行,所以就變成:

for i in 1 2 3 4 5 
+0

謝謝,這讓很多感覺! – user3101059

0

eval echo {1..$1}產生的所有號碼從1第一個參數列表。然後循環所有這些值並將它們乘以n,生成n!

{a..b}語法生成從ab(含)的所有數字的列表。您必須致電eval,因爲..語法需要數字而不是變量 - 在運行該命令之前,允許eval允許變量替換。

我還懷疑你想寫for i in `eval echo {1..$1}`而不是for i `eval echo {1..$1}`,因爲後者會產生語法錯誤。

+0

是的,我沒有忘記「in」。感謝您的解釋。 – user3101059

+0

回覆:「'eval'在運行命令之前執行變量替換」:通常情況下是這樣,但在這種情況下沒有參數替換。在調用「eval」之前,'$ 1'被替換爲'5'。 – ruakh

2

爲了避免混亂和eval使用,你可以使用c-style for-loop

for ((i=1; i<=$1; i++)) 
+0

C語言對我來說總是更有意義。 – user3101059