這個腳本中的「eval」是什麼?這是什麼評估?Linux Script混淆
#!/bin/bash
n=1
for i `eval echo {1..$1}`
do
n=$((n * i))
done
這個腳本中的「eval」是什麼?這是什麼評估?Linux Script混淆
#!/bin/bash
n=1
for i `eval echo {1..$1}`
do
n=$((n * i))
done
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
謝謝,這讓很多感覺! – user3101059
的eval echo {1..$1}
產生的所有號碼從1
第一個參數列表。然後循環所有這些值並將它們乘以n
,生成n!
。
{a..b}
語法生成從a
到b
(含)的所有數字的列表。您必須致電eval
,因爲..
語法需要數字而不是變量 - 在運行該命令之前,允許eval
允許變量替換。
我還懷疑你想寫for i in `eval echo {1..$1}`
而不是for i `eval echo {1..$1}`
,因爲後者會產生語法錯誤。
是的,我沒有忘記「in」。感謝您的解釋。 – user3101059
回覆:「'eval'在運行命令之前執行變量替換」:通常情況下是這樣,但在這種情況下沒有參數替換。在調用「eval」之前,'$ 1'被替換爲'5'。 – ruakh
反引號評估表達式; 'eval'評估從1到$ 1(你的函數的參數)擴展的花括號。我認爲只要'我在\'echo {1 .. $ 1} \''中就可以做到這一點。 – Floris
使用'eval'通常是一件壞事。考慮使用'seq'來代替:'for i in \'seq 1 $ 1'';做echo $ i; done'。 – Lynch