2011-10-10 80 views
0

是否有任何hack在運行時不在bash中評估變量?我有一個for循環是這樣的: 問題是我有它回聲裏面...否則這個工程太棒了!在for循環運行之前不會評估變量

for i in $(seq 0 100); do echo $(echo $RANDOM % 10 | bc); done 

結果例如總是3 ...

+0

如果你想要的只是一個數字,那麼幾乎不需要「bc」管道。 'R = $ RANDOM; Q = $ {R%?}; echo $ {r#$ q}'在純'sh'語法中執行此操作。 – tripleee

+0

它對我來說很有用(即我得到不同的隨機數字)。 –

回答

3

除了你的問題:你的解決方案使用2個外部進程,1管,1子對一件容易的事。純擊:

for ((CNTR=0; CNTR<=100; CNTR+=1)); do 
    echo $((RANDOM%10)) 
done 
+0

這裏需要一個附加字符串的回聲:'echo「foo $((RANDOM%10))」' – Smamatti

+0

+1,這裏不需要外部過程。 –

-1

你有一對夫婦的問題,在這裏,我不認爲任何人有可變的評估做。

第一個是$RANDOM這裏沒有定義。也許你已經把它設置爲3某處,這就是爲什麼你總是得到3作爲輸出?

第二個是你不需要這兩個echo s。另一個圍繞另一個圍繞$()

+0

$ RANDOM是一個內部的bash功能。它被定義了! – Smamatti

+0

yes $ RANDOM是由bash定義的......我認爲問題在於bash在處理BUT之前僅對回聲進行評估。如果我不使用回聲兩次,我得到正確的結果... – reox

+0

聖莫里,我從來不知道! – drysdam

0

這適用於我。

for i in $(seq 0 100); 

do 
    echo $RANDOM % 10 | bc 
done 

,我看到了回聲這個工作對我來說:

for i in $(seq 0 100); 

do 
    echo "foo $(echo $RANDOM % 10 | bc)" 
done 
+0

對我來說也是,但我需要回顯一個字符串,然後得到隨機值:echo「foo $(echo $ RANDOM%10 | bc)」 – reox

+0

@reox我用「foo」的回聲更新瞭解決方案 – Smamatti

0

或者,一個括號擴展可以使用:

for i in {0..100}; do 
    echo $((RANDOM%10)) 
done 
0

當你想搶佔變量替換傳統的解決方案是使用引用和eval。這不像純Bash解決方案那麼優雅,但顯然更便攜。

for i in $(seq 0 100); do 
    eval 'echo $RANDOM % 10 | bc' 
done 

這只是對原始代碼的最小重構,我只是爲了完整而發佈它。