Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于shell behavoir中指定大小的循环_Shell_For Loop_Terminal - Fatal编程技术网

对于shell behavoir中指定大小的循环

对于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

我正在尝试做一件看似简单的事情:一个脚本,它从命令行($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(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
是序列的缩写,可以采用任何起始和结束数字,可选的“跳过”因子sa
seq 0 5 100
将按5到100计数


我希望这能有所帮助。

我在同事的帮助下解决了这个问题,但没有足够的代表回答我自己的问题。明天会寄的。谢谢!一位同事帮我解决了这个问题:
for((i=1;iHm…是的,我希望我已经想到了这一点,因为这是流程密集度最低的解决方案。任何需要
$(…)
的东西都是启动一个额外的bash进程来处理一个命令(可能更多),所以它在CPU和时间上更昂贵。如果这是一次性的,那没关系,如果你的循环在未来的几年中会运行数百万次,那么
((i=1;问题是大括号扩展发生得太早,原始代码无法运行。'..'在扩展'$1'之前尝试并失败。Sheller的解决方案有效,因为'eval'在扩展'..'之前传递了所需的字符串。