2011-02-10 126 views
6

當seq編號是變量時,我在Bash中的內建序列(即:不使用seq)存在問題。例如,此工作和打印箱1 2 3:序列擴展和bash中的變量

for i in {1..3};do echo $i;done 

但這:

的bash-3.2 $一個= 3;對於i在{1 .. $一個};做回聲$我;做

失敗,並打印我{} 1..3僅

這適用於ZSH,我知道我有一個替代方案,使計數器的事情,但不知道是否這是一個錯誤或支柱擴展功能!

+1

可能重複http://stackoverflow.com/ question/4764383/arguments-passed-in-for-loop-in-bash-script) – 2011-02-10 11:40:28

回答

4

在bash,支架膨脹變量擴展之前進行。訂單請參閱Shell Expansions

$ a=7; echo {1..3} {4..$a} 
1 2 3 {4..7} 

如果要使用變量,請使用C樣式for循環,如Shawn的答案中所述。

3
$ num=3 
$ for i in $(eval echo {1..$num});do echo $i;done 
1 
2 
3 
+0

看起來像一種黑客給我...但是,謝謝.. – 2011-02-10 11:41:15

+0

比C風格的循環效率低(由於使用一個子外殼)並承擔安全風險:除非完全控制或驗證了傳遞給`eval`的字符串中使用的變量的值,否則不要使用`eval`。否則,可能會執行任意命令。例如,以下精心設計的`$ num`值將枚舉當前用戶的主文件夾中的文件: `num ='}; ls〜; {';我在$(eval回聲{1 .. $ num});做echo $ i;完成` – mklement0 2016-06-23 03:19:03

4

另一種方法是使用雙括號構建體,其允許C樣式循環:

A=3 
for ((i=1; i<=$A; i++)); do 
    echo $i 
done 
+0

嗨,我不感興趣使用外部命令,但內部bash內建。 – 2011-02-10 11:40:40

+0

他不想使用`seq` – kurumi 2011-02-10 11:40:57

1

另一種選擇是使用序列命令:

a=3; for i in $(seq 1 $a);do echo $i;done 
-1

試試這個:

$ start=3 
$ end=5 
$ echo {$(echo $start)..$(echo $end)} 
0

我也需要做somenthing,如:

N =一些數量; {1 .. $ n..increment}

所以就用該替代方法:

n=100 
i=1 
while [ $i -lt $n ] 
do 
echo $i 
i=$(($i+1)) 
done 
的[在bash腳本傳遞到用於環路參數](