我運行以下的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行,但事實並非如此。我應該改變什麼?謝謝!
我運行以下的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行,但事實並非如此。我應該改變什麼?謝謝!
大括號擴展只適用於文字,它不擴展變量。
可能的解決方法:
for i in $(seq 1 $num) ; do
大括號不擴展變量。您可以使用
for i in $(seq $num); do
echo "a"
done
請參閱man bash
:
[...]
序列表達式的形式爲
{x..y[..incr]}
,其中x
和y
要麼 整數或單個字符,INCR,可選增量,是整數。 提供整數時,表達式擴展爲x
和 之間的每個數字,包括y
。[...]
括號擴展被任何其他擴展之前執行,並且 特殊至其他擴展的任何字符被在結果保留。這是嚴格的文本。 Bash不會對擴展或大括號之間的文本應用任何語法解釋。
[...]
嘗試:
for ((i=0; i < $num; i++))
do
echo "a"
done
閱讀:
無視涉及seq(1)
的答案。 cdarke's answer演示正確的迭代。
另請注意,這是一個特定於bash的問題。其他具有大括號擴展的外殼首先會評估參數展開,但是存在折衷。
請不要只告訴我們什麼不該做,但也爲什麼不。爲什麼不使用'seq'?性能?權衡(便利還是速度)? – mklement0
@mklement分詞命令替換輸出是一個壞主意,任何'for $(anything)'模式中的x都是有問題的。使用'seq'進行迭代是沒有意義的,因爲有內置的方法可以做到更快,更短和便攜。 'seq'是一個非標準的命令。不理解這個原則也是導致使用'$(ls)'的提問者更嚴重的錯誤的原因。對於幾乎每個用bash標記的問題的答案,我都不想重複使用基本用法的常見問題。也許它在S/O的其他地方並不是那麼糟糕。 – ormaaj
謝謝澄清;很高興知道'seq'是非標準的。是的,使用'((...))'是更快,更好的選擇,但它顯然不是_shorter_。 OP使用'$(ls ... | wc -l)'沒有什麼問題 - 它總是隻返回一個_single,white-space-free_ token,所以沒有不希望的分詞的危險(這是不需要的結果中引入空白,但這是一個單獨的問題)。一般來說,'for $(...)'中的x是有潛在問題的,但它肯定有它的用途:適當的逐行處理所需要的就是將'$ IFS'設置爲'$'\ n' '(暫時)。 – mklement0
OS X用戶注意:可選增量功能在OS X 10.8.2中不可用,該功能隨bash 3.2.48一起提供。 – mklement0