如果fi循环UNIX,则从for循环转换为while

时间:2013-04-28 17:59:07

标签: bash unix if-statement for-loop while-loop

我正在试图找出如何将以下for循环转换为while循环或直到循环包括如果for for UNIX这里是代码......

#!/bin/bash

if [ $# -gt 0 ] ; then 
  start=$1
 end=$3
 step=$2

 for x in `seq $start $step $end` ; do
  number $x
  done

else
 echo Enter at least one number on the command line.

fi

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:1)

(( x = start ))
until (( x > end ))
do
  number $x
  (( x += step ))
done

答案 1 :(得分:0)

对于这样的循环,最简单的方法是使用数字样式的for循环:

for ((x=start; x<=end; x+=step)); do
    number $x
done

答案 2 :(得分:0)

使用seq很有用,因为它有stepend值的默认值。如果只给出一个或两个参数,我将其添加到if。如果给定的参数不是数字(默认值为0),它也会处理这种情况。如果step为零,则可能会遇到无限循环。如果您删除此检查,则其工作方式与seq版本相同。

if [ $# -gt 0 ] ; then
  x=$(($1+0))
  end=$((${3:-$x}+0))
  step=$((${2:-1}+0))

  [ $step -eq 0 ] && echo "Step is zero!" && exit 1

  while [ $x -le $end -a $step -gt 0 -o $x -ge $end -a $step -lt 0 ]; do
    echo $x
    x=$((x+step))
  done

else
   echo Enter at least one number on the command line.
fi

如果您想使用,请在while循环中将echo更改为number

示例:

$ ./e.sh 1    
1
$ seq 1
1
$ ./e.sh 1 1 3
1
2
3
$ seq 1 1 3
1
2
3
$ ./e.sh 1 -1 3
$ seq 1 -1 3
$ ./e.sh 3 -1 1
3
2
1
$ seq 3 -1 1
3
2
1
$ ./e.sh 1 0 1 
Step is zero!
$ seq 1 0 1|head 
1
1
1
... (endlessly)
$ ./e.sh 1 .1 1.2
./e.sh: line 3: 1.2+0: syntax error: invalid arithmetic operator (error token is ".2+0")
$ seq 1 .1 1.2
1.0
1.1
1.2

Bash算法不适用于浮点数,但seq可以。如果您需要此功能,可以使用x=$(echo $x + $step|bc)格式。另外,$((...))应替换为$(...|bc)之类的行。

答案 3 :(得分:0)

在Bash 4中你也可以这样做:

for i in {$start..$stop..$step}; do
    echo $i
done