Shell脚本"for"循环语法

eyk*_*nal 182 unix syntax shell

我有以下工作:

for i in {2..10}
do
    echo "output: $i"
done
Run Code Online (Sandbox Code Playgroud)

它产生一束线output: 2,output: 3,等.

但是,尝试运行以下内容:

max=10
for i in {2..$max}
do
    echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

产生以下内容:

output: {2..10}
Run Code Online (Sandbox Code Playgroud)

如何让编译器实现它应该将$ max视为数组的另一端,而不是字符串的一部分?

wha*_*ame 222

支撑扩展,{x..y}在其他扩展之前执行,因此您不能将其用于可变长度序列.

相反,使用该seq 2 $max方法作为用户暴徒声明.

所以,对于你的例子,它将是:

max=10
for i in `seq 2 $max`
do
    echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

  • @miller`for((...))`语法不是POSIX,这意味着它不会像Alpine Linux那样开箱即用.`seq`. (11认同)

sys*_*USE 68

尝试以下算术表达式for:

max=10
for (( i=2; i <= $max; ++i ))
do
    echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

这在大多数版本的bash中都可用,并且也应该与Bourne shell(sh)兼容.

  • 很好的答案,但这不适用于`#!/ bin/sh`. (18认同)
  • 很少有系统具有专用的"sh",而是使其成为另一个shell的链接.理想情况下,这样一个被调用为"sh"的shell只会*支持POSIX标准中的那些功能,但默认情况下会让它们的一些额外功能通过.C风格的for循环不是POSIX功能,但实际的shell可能处于`sh`模式. (8认同)

Nie*_*jou 27

手动循环:

i=0
max=10
while [ $i -lt $max ]
do
    echo "output: $i"
    true $(( i++ ))
done

如果你没有完全POSIX,您可以用算术循环:

max=10
for (( i=0; i < max; i++ )); do echo "output: $i"; done

或者在BSD系统上使用jot(1):

for i in $( jot 0 10 ); do echo "output: $i"; done

  • `true $((i ++))`在所有情况下都不起作用,所以大多数可移植的都是`true $((i = i + 1))`. (3认同)

mob*_*mob 9

如果seq您的系统上有可用的命令:

for i in `seq 2 $max`
do
  echo "output: $i"
done
Run Code Online (Sandbox Code Playgroud)

如果没有,那么用穷人的seqperl:

seq=`perl -e "\$,=' ';print 2..$max"`
for i in $seq
do
  echo "output: $i"
done
Run Code Online (Sandbox Code Playgroud)

看那些引号.


eph*_*ent 9

有不止一种方法可以做到这一点.

max=10
for i in `eval "echo {2..$max}"`
do
    echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

  • 安全风险,因为`eval`将评估*你设置'max`的任何*.考虑`max ="2}; echo ha;#"`,然后用更具破坏性的东西替换`echo ha`. (7认同)
  • (S)他将max设置为10.没有风险. (5认同)

Jah*_*hid 5

这是一种方式:
Bash:

max=10
for i in $(bash -c "echo {2..${max}}"); do echo $i; done
Run Code Online (Sandbox Code Playgroud)

上面的 Bash 方式也适用于kshand zsh,当分别bash -c替换为ksh -c或 时zsh -c

注意:for i in {2..${max}}; do echo $i; done适用于zshksh


ras*_*dcs 5

我们可以像 C 编程一样迭代循环。

#!/bin/bash
for ((i=1; i<=20; i=i+1))
do 
      echo $i
done
Run Code Online (Sandbox Code Playgroud)