使用括号扩展范围中的变量馈送到for循环

spr*_*aff 46 bash for-loop brace-expansion

这是myscript.sh

#!/bin/bash
for i in {1..$1};
do
    echo $1 $i;
done
Run Code Online (Sandbox Code Playgroud)

如果我运行myscript.sh 3输出是

3 {1..3}
Run Code Online (Sandbox Code Playgroud)

代替

3 1
3 2
3 3
Run Code Online (Sandbox Code Playgroud)

显然$3包含正确的值,为什么不像for i in {1..$1}for i in {1..3}直接写的一样?

jor*_*anm 67

你应该使用C风格的for循环来完成这个:

for ((i=1; i<=$1; i++)); do
   echo $i
done
Run Code Online (Sandbox Code Playgroud)

这避免了外部命令和令人讨厌的eval语句.

  • @Temak你需要像这样运行它:`bash test.sh 12`.`$ 1`是位置arg. (3认同)

Oli*_*rth 27

因为大括号扩展发生在变量扩展之前.http://www.gnu.org/software/bash/manual/bashref.html#Brace-Expansion.

如果你想使用大括号,你可能会有这样的事情:

for i in `eval echo {1..$1}`;
do
    echo $1 $i;
done
Run Code Online (Sandbox Code Playgroud)

简介:Bash很卑鄙.

  • 嘿,答案为+1,卑鄙为-0.5. (2认同)

kev*_*kev 15

您可以使用seq命令:

for i in `seq 1 $1`
Run Code Online (Sandbox Code Playgroud)

或者您可以使用C风格for...loop:

for((i=1;i<=$1;i++))
Run Code Online (Sandbox Code Playgroud)