0

我试图弄清楚如何将以下 for 循环转换为 while 循环或 until 循环,包括 if fi 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

4 回答 4

1
(( x = start ))
until (( x > end ))
do
  number $x
  (( x += step ))
done
于 2013-04-28T18:06:40.047 回答
0

在 Bash 4 中,您也可以这样做:

for i in {$start..$stop..$step}; do
    echo $i
done
于 2013-04-29T09:44:49.907 回答
0

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

for ((x=start; x<=end; x+=step)); do
    number $x
done
于 2013-04-28T20:38:26.463 回答
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)类似的行代替。

于 2013-04-29T09:31:34.710 回答