Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
在bash脚本中传递给for循环的参数_Bash_Loops_Command Line Arguments - Fatal编程技术网

在bash脚本中传递给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为整数或单个字符 大括号展开在任何其他展

我试图将参数作为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为整数或单个字符

大括号展开在任何其他展开之前执行,结果中保留其他展开所特有的任何字符。这是严格的文本。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