for循环跳过几步

时间:2015-03-19 21:46:31

标签: bash shell

我正试图找到一种方法,在步骤100中$ {x} == 4时跳过中间(150到200)之间的步骤。什么是最好的方法。我试图设置step = 250,但它被改回150.

for step in $(seq "$stepnum" 50 650)
do
        case $step in
        "50")
             # do something
         ;;
        "100")

# do something
             if [[ ${x} == 4 ]]
           then
               step=250
            fi
               ## skip to step 250
         ;;
        "150")
# do something
         ;;
        "200")
# do something
         ;;
        "250")
        ;;
    *)

    ;;
    esac

3 个答案:

答案 0 :(得分:0)

使用算术for表达式而不是in

for (( step=stepnum ; step+=50 ; step<=650 ))

这就是区别:

  • 使用in,循环变量将遍历示例中seq提供的列表中的每个成员,无论您如何修改计数器。
  • 使用算术for,循环变量将按照循环头的第二个语句中的指示递增,因此如果您修改循环体中的计数器,它将按预期工作。

键入help forman bash,详细了解for语法。

答案 1 :(得分:0)

我提供此解决方案,因为OP已表明他们不想修改循环语法。生成的代码结构不合理:

if [[ ${x} == 4 ]] && [ step -gt 100 ] && [ step -lt 250 ]
then
  continue
fi

case

之前添加此代码段

答案 2 :(得分:0)

放置在循环开头的continue是一种可以做你想做的方法:

#!/bin/bash

stepnum=50
x=${1:-0}     # x is 0 by default, set with 1st argument on command line

for step in $(seq "$stepnum" 50 650)
do
        [ $step -ge 150 -a $step -le 200 -a $x -eq 4 ] && continue

        case $step in
        "50")
            # do something
            printf "   50 hit\n"
        ;;
        "100")
            # do something
            printf "  100 hit\n"
        ;;
        "150")
            # do something
            printf "  150 hit\n"
        ;;
        "200")
            # do something
            printf "  200 hit\n"
        ;;
        "250")
            # do something
            printf "  250 hit\n"
        ;;
        *)
            # do something
            printf "  %3d - default hit\n" $step
        ;;
        esac
done

exit 0

输出(x = 4)

$ bash caseseq.sh 4
   50 hit
  100 hit
  250 hit
  300 - default hit
  350 - default hit
  400 - default hit
  450 - default hit
  500 - default hit
  550 - default hit
  600 - default hit
  650 - default hit

输出(x =其他任何内容)

$ bash caseseq.sh
   50 hit
  100 hit
  150 hit
  200 hit
  250 hit
  300 - default hit
  350 - default hit
  400 - default hit
  450 - default hit
  500 - default hit
  550 - default hit
  600 - default hit
  650 - default hit

注意:只是跳过150

        [ $step -eq 150 ] && continue

示例:更改for循环索引

#!/bin/bash

for ((i=0; i< 10; i++)); do

    [[ $i == [257] ]] && ((i++))
    printf "index %s\n" $i

done

<强>输出

$ bash chgidx.sh
index 0
index 1
index 3
index 4
index 6
index 8
index 9