在bash脚本中传递给for循环的参数
我试图将参数作为for循环的最大限制传递,如下所示:在bash脚本中传递给for循环的参数,bash,loops,command-line-arguments,Bash,Loops,Command Line Arguments,我试图将参数作为for循环的最大限制传递,如下所示: #!/bin/bash for i in {1..$1} do echo $i done x=10; for i in $(eval echo {1..$x}); do echo $i; done 但是,当使用参数2调用时,它返回{1..2},而不是执行脚本并给我 1 2 变量替换不是在花括号内完成的。可以使用固定数字,但不能使用变量 支架扩张 序列表达式的形式为{x..y},其中x和y为整数或单个字符 大括号展开在任何其他展
#!/bin/bash
for i in {1..$1}
do
echo $i
done
x=10; for i in $(eval echo {1..$x}); do echo $i; done
但是,当使用参数2
调用时,它返回{1..2}
,而不是执行脚本并给我
1
2
变量替换不是在花括号内完成的。可以使用固定数字,但不能使用变量 支架扩张 序列表达式的形式为{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
对于((i=1;i以及John Kugelman的解决方案,您可以像这样使用eval
:
#!/bin/bash
for i in {1..$1}
do
echo $i
done
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
当我读书的时候
做
回声$i
完成…或者在不太可能的情况下,您只需要序列号:
seq $1
:-)这将遍历所有真参数(也称为“testo mesto”是一个参数)
#遍历所有参数
for((i=1;i)您的解决方案是正确的,但您的推理是错误的。大括号展开发生在变量替换之前,但{1..$1}
不是有效的大括号展开。谢谢,第一个解决方案成功了(第二个解决方案已过时)。您可能想将2
s更改为$1
,以符合我原来的问题。ksh93
和zsh
有不同的扩展顺序:ksh93-c'n=3;对于{1..$n}中的i;出于好奇,请您解释一下为什么$(seq 1$1)
不建议用于大序列?我假设seq
的性能会显著下降,但如果一些用户认为这与循环语法的常规有关(即,明确这不是ARG_MAX
问题),则解释可能仍然有用
#cycle through all args
for (( i=1; i<=$1; i++ )); do
echo "${!i}"
done