2012-10-24 75 views
0

我運行以下的bash代碼:對於使用變量作爲條件循環,猛砸

num=$(ls -1 $ini/*.ini | wc -l) 
echo "Running $num simulations..." 
for i in {1..$num}; 
do 
    echo "a" 
done 

而且我得到以下輸出:

Running 24 simulations... 
a 

它應打印 'A' 的24行,但事實並非如此。我應該改變什麼?謝謝!

回答

0

大括號擴展只適用於文字,它不擴展變量。

可能的解決方法:

for i in $(seq 1 $num) ; do 
1

大括號不擴展變量。您可以使用

for i in $(seq $num); do 
    echo "a" 
done 

請參閱man bash

[...]

序列表達式的形式爲{x..y[..incr]},其中xy要麼 整數或單個字符,INCR,可選增量,是整數。 提供整數時,表達式擴展爲x和 之間的每個數字,包括y

[...]

括號擴展被任何其他擴展之前執行,並且 特殊至其他擴展的任何字符被在結果保留。這是嚴格的文本。 Bash不會對擴展或大括號之間的文本應用任何語法解釋。

[...]

+0

OS X用戶注意:可選增量功能在OS X 10.8.2中不可用,該功能隨bash 3.2.48一起提供。 – mklement0

1

嘗試:

for ((i=0; i < $num; i++)) 
do 
    echo "a" 
done 
0

閱讀:

無視涉及seq(1)的答案。 cdarke's answer演示正確的迭代。

另請注意,這是一個特定於bash的問題。其他具有大括號擴展的外殼首先會評估參數展開,但是存在折衷。

+0

請不要只告訴我們什麼不該做,但也爲什麼不。爲什麼不使用'seq'?性能?權衡(便利還是速度)? – mklement0

+0

@mklement分詞命令替換輸出是一個壞主意,任何'for $(anything)'模式中的x都是有問題的。使用'seq'進行迭代是沒有意義的,因爲有內置的方法可以做到更快,更短和便攜。 'seq'是一個非標準的命令。不理解這個原則也是導致使用'$(ls)'的提問者更嚴重的錯誤的原因。對於幾乎每個用bash標記的問題的答案,我都不想重複使用基本用法的常見問題。也許它在S/O的其他地方並不是那麼糟糕。 – ormaaj

+0

謝謝澄清;很高興知道'seq'是非標準的。是的,使用'((...))'是更快,更好的選擇,但它顯然不是_shorter_。 OP使用'$(ls ... | wc -l)'沒有什麼問題 - 它總是隻返回一個_single,white-space-free_ token,所以沒有不希望的分詞的危險(這是不需要的結果中引入空白,但這是一個單獨的問題)。一般來說,'for $(...)'中的x是有潛在問題的,但它肯定有它的用途:適當的逐行處理所需要的就是將'$ IFS'設置爲'$'\ n' '(暫時)。 – mklement0