参数在bash脚本中传递给for循环

时间:2011-01-21 22:16:06

标签: bash loops command-line-arguments

我试图将参数作为for循环的最大限制传递,如下所示:

#!/bin/bash

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

但是当使用参数{1..2}调用时返回2,而不是执行脚本并给我

1
2

4 个答案:

答案 0 :(得分:36)

变量替换不是在花括号内完成的。您可以使用固定数字而不是变量。

  

Brace Expansion

     

序列表达式采用{x..y}形式,其中x和y是整数或单个字符。 ...

     

在任何其他扩展之前执行大括号扩展,并且在结果中保留对其他扩展特殊的任何字符。这是严格的文字。 Bash不对扩展的上下文或大括号之间的文本应用任何语法解释。

     

正确形成的大括号扩展必须包含不带引号的开括号和右大括号,以及至少一个不带引号的逗号或有效的序列表达式。任何不正确形成的大括号扩展都保持不变。

尝试以下方法之一:

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

# Not recommended with large sequences.
for i in $(seq 1 $1); do
    echo $i
done

答案 1 :(得分:7)

这将遍历所有真正的论点(a.k.a。“testo mesto”是一个论点)

#cycle through all args
for (( i=1; i<=$1; i++ )); do
    eval arg=\$$i
    echo "$arg"
done

OR

#cycle through all args
for (( i=1; i<=$1; i++ )); do
    echo "${!i}"
done

答案 2 :(得分:4)

......或者在极少数情况下你真的只想要序号:

seq $1

: - )

答案 3 :(得分:3)

与John Kugelman的解决方案一样,您可以像这样使用eval

x=10; for i in $(eval echo {1..$x}); do echo $i; done

或者,如果$ 1是10,那么:

set -- 10
for i in $(eval echo {1..$1})
do
    echo $i
done

你也可以使用一些变体:

set -- 1000
eval echo {1..$1} |
while read i
do
    echo $i
done

或者:

set -- 1000
while read i
do
     echo $i
done <(eval echo {1..$1})

使用流程替换。