shell脚本“for”循环语法(Shell script “for” loop syntax)

2019-07-18 13:18发布

我得到的工作如下:

for i in {2..10}
do
    echo "output: $i"
done

它产生一束线的output: 2output: 3 ,依此类推。

但是,试图运行以下命令:

max=10
for i in {2..$max}
do
    echo "$i"
done

产生如下:

output: {2..10}

我怎样才能让编译器去实现它应该把$最大的阵列的另一端,而不是一个字符串的一部分?

Answer 1:

括号扩展,{x..y}的其他扩展之前执行,所以不能使用,对于可变长度的序列。

相反,使用seq 2 $max方法, 用户暴民说 。

所以,你的例子那就是:

max=10
for i in `seq 2 $max`
do
    echo "$i"
done


Answer 2:

尝试的算术表达式版本for

max=10
for (( i=2; i <= $max; ++i ))
do
    echo "$i"
done

这是在bash的大多数版本,而应该是Bourne shell的(上海)兼容也。



Answer 3:

手动步骤的循环:

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系统使用小额 (1):

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


Answer 4:

不止一种方法去做一件事。

max=10
for i in `eval "echo {2..$max}"`
do
    echo "$i"
done


Answer 5:

如果seq指挥系统上可用:

for i in `seq 2 $max`
do
  echo "output: $i"
done

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

seq=`perl -e "\$,=' ';print 2..$max"`
for i in $seq
do
  echo "output: $i"
done

看看那些引号。



Answer 6:

这是一种方式:
击:

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

上述击方式会为工作kshzsh太多,当bash -c替换ksh -czsh -c分别。

注: for i in {2..${max}}; do echo $i; done for i in {2..${max}}; do echo $i; done for i in {2..${max}}; do echo $i; done的作品zshksh



Answer 7:

我们可以重复循环等作为C语言编程。

#!/bin/bash
for ((i=1; i<=20; i=i+1))
do 
      echo $i
done


Answer 8:

这工作在Mac OS X.

它包括一个BSD日期,如何增加和减少日期还有的例子:

for ((i=28; i>=6 ; i--));
do
    dat=`date -v-${i}d -j "+%Y%m%d"` 
    echo $dat
done


Answer 9:

嗯,我没有足够的seq我的系统上安装Command键(Mac OS X v10.6.1(雪豹)),我结束了使用while循环,而不是:

max=5
i=1

while [ $max -gt $i ]
do
    (stuff)
done

* 耸肩 *无论什么工作。



Answer 10:

这些都做{1..8}和应该都是POSIX。 他们还如果你把一个条件不会破坏continue在循环。 该规范的方法:

f=
while [ $((f+=1)) -le 8 ]
do
  echo $f
done

其他方式:

g=
while
  g=${g}1
  [ ${#g} -le 8 ]
do
  echo ${#g}
done

另有:

set --
while
  set $* .
  [ ${#} -le 8 ]
do
  echo ${#}
done


Answer 11:

使用:

max=10
for i in `eval echo {2..$max}`
do
    echo $i
done

你需要明确的“EVAL”呼吁重新评估{}后变量替换。



文章来源: Shell script “for” loop syntax