对于shell behavoir中指定大小的循环
我正在尝试做一件看似简单的事情:一个脚本,它从命令行($1)获取一个变量,并将其用作for循环的长度。因此,如果命令在终端中为run.sh:对于shell behavoir中指定大小的循环,shell,for-loop,terminal,Shell,For Loop,Terminal,我正在尝试做一件看似简单的事情:一个脚本,它从命令行($1)获取一个变量,并将其用作for循环的长度。因此,如果命令在终端中为run.sh: run.sh 5 将运行for循环5次。这是我的尝试: #!/bin/sh for i in {1..$1};do echo $i done 但我收到的唯一输出是: {1..5} 我怎样才能解决这个问题 注意:我完全是bash/shell脚本的初学者。您真的在使用bash shell吗。并非所有shell(尤其是true/bin/sh(bourn
run.sh 5
将运行for循环5次。这是我的尝试:
#!/bin/sh
for i in {1..$1};do
echo $i
done
但我收到的唯一输出是:
{1..5}
我怎样才能解决这个问题
注意:我完全是bash/shell脚本的初学者。您真的在使用bash shell吗。并非所有shell(尤其是true/bin/sh(bourne))都支持该功能。要消除您的情况的歧义,请使用
#!/bin/bash
在脚本的顶部
一个解决办法是使用
for i in $(eval echo {1..$1} ); do echo $i; done
eval
表示,“对于当前命令字符串,在本例中为echo${1..$1}
,暂时不要执行该命令,请重新计算所有可扩展变量的完整命令行。”
如果您的系统具有seq
cmd,则可以将其重写为
for i in $(seq 1 $1 ); do echo $i; done
seq
是序列的缩写,可以采用任何起始和结束数字,可选的“跳过”因子saseq 0 5 100
将按5到100计数
我希望这能有所帮助。我在同事的帮助下解决了这个问题,但没有足够的代表回答我自己的问题。明天会寄的。谢谢!一位同事帮我解决了这个问题:
for((i=1;iHm…是的,我希望我已经想到了这一点,因为这是流程密集度最低的解决方案。任何需要$(…)
的东西都是启动一个额外的bash进程来处理一个命令(可能更多),所以它在CPU和时间上更昂贵。如果这是一次性的,那没关系,如果你的循环在未来的几年中会运行数百万次,那么((i=1;问题是大括号扩展发生得太早,原始代码无法运行。'..'在扩展'$1'之前尝试并失败。Sheller的解决方案有效,因为'eval'在扩展'..'之前传递了所需的字符串。