【问题标题】:Converting from for loop to while if fi loop UNIX从 for 循环转换为 while if fi 循环 UNIX
【发布时间】:2013-04-22 08:51:21
【问题描述】:

我正在尝试弄清楚如何将以下 for 循环转换为 while 循环或 until 循环,包括适用于 UNIX 的 if fi 这是代码...

#!/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

非常感谢任何帮助!

【问题讨论】:

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


    【解决方案1】:
    (( x = start ))
    until (( x > end ))
    do
      number $x
      (( x += step ))
    done
    

    【讨论】:

    • 如果 step-1 这可能会给出非 seq 的结果。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      使用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) 之类的行。

      【讨论】:

      • @user2329706:如果我能提供帮助,我很高兴。建议你使用原版seq
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-12-18
        • 2018-02-22
        • 2017-04-26
        • 2018-08-19
        • 1970-01-01
        • 1970-01-01
        • 2022-12-04
        相关资源
        最近更新 更多