Bash 使用馈送到for循环的支架扩展范围中的变量

Bash 使用馈送到for循环的支架扩展范围中的变量,bash,for-loop,brace-expansion,Bash,For Loop,Brace Expansion,这里是myscript.sh #!/bin/bash for i in {1..$1}; do echo $1 $i; done 如果运行myscript.sh3,则输出为 3 {1..3} 而不是 3 1 3 2 3 3 显然,$3包含正确的值,那么为什么{1..$1}中的i的的行为与我直接为{1..3}中的i编写的的行为不一样呢?,因为大括号展开发生在变量展开之前 如果你想使用大括号,你可以这样做: for i in `eval echo {1..$1}`; do ec

这里是myscript.sh

#!/bin/bash
for i in {1..$1};
do
    echo $1 $i;
done
如果运行
myscript.sh3
,则输出为

3 {1..3}
而不是

3 1
3 2
3 3

显然,
$3
包含正确的值,那么为什么{1..$1}中的i的
的行为与我直接为{1..3}中的i编写的
的行为不一样呢?

,因为大括号展开发生在变量展开之前

如果你想使用大括号,你可以这样做:

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

小结:Bash很卑鄙。

您可以使用
seq
命令:

for i in `seq 1 $1`
或者,您也可以将C样式
用于…循环

for((i=1;i<=$1;i++))

for((i=1;i您应该使用C样式的for循环来实现这一点:

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

for((i=1;i我知道您在标题中提到了bash,但我要补充的是,{$1..$2}中的for i按照zsh的预期工作。如果您的系统安装了zsh,您可以将shebang更改为zsh


将zsh与示例“for i in{$1..$2}”一起使用还有一个额外的好处,即$1可以小于$2,并且仍然有效,如果您希望通过C样式的for循环实现这种灵活性,这需要相当多的麻烦。

这里有一种方法可以在大括号内展开变量,而无需eval:

end=3
declare -a 'range=({'"1..$end"'})'
我们现在有了一个很好的数字数组:

for i in ${range[@]};do echo $i;done
1
2
3

嘿,答案是+1,-0.5是卑鄙的。@Glenjackman:哇,你是说Bash的无数扩展和逃逸规则并不卑鄙?我觉得在涉及
eval
的答案上说+1是肮脏的。re:vile:
Bash
不是卑鄙的,但有点像直接喝谷类酒。有些人似乎喜欢它,但很难不说出来刚开始的时候,你做得越多,你就越不会被它困扰。@Sorpigal:那一定是我。我几乎每天都用它,但它仍然困扰着我…(但是我也不擅长纯酒精)这仍然有效并解决了问题。谢谢!C风格的for循环优于外部seq命令。您的示例脚本将在ksh93和zsh中工作。不适用于我
test.sh:第1行:((: i@Temak您使用的是
bash
?您的shebang
#!/bin/bash
还是
#!/bin/sh
?@jordann,文件只包含这三行。我使用的是GNU bash,版本4.3.11(1)-发行版(x86#64-pc-linux-GNU).sh运行脚本
bash test.sh
@Temak您需要这样运行:
bash test.sh 12
$1
是一个位置参数。是的,我没有注意到。Sorrry:)