以循环方式退出ksh的惯用方法

时间:2011-12-12 17:35:49

标签: shell while-loop ksh shell-trap

我有以下5秒计时器,每秒打印一个星号。

timer () {
  i=1
  trap 'i=5' INT

  while [[ $i -le 5 ]]; do
    sleep 1
    printf "*"
    ((i+=1))
  done
}

不知何故,陷阱块似乎有点hackish,我想知道是否有更正确的方法来中断整个循环(而不仅仅是当前的睡眠周期)。我试过了:

trap 'print "foo"' INT

在函数内部和外部的各个位置,但正如我之前提到的那样,它只会中断当前的睡眠周期。

2 个答案:

答案 0 :(得分:0)

也许我错过了什么,但出了什么问题:

timer() {
  i=0
  while (( ++i <= 5 )); do
    sleep 1
    printf '*'
  done
}

答案 1 :(得分:0)

这适用于bash:

#!/bin/bash

function timer {

    trap "break" INT

    i=0
    while (( ++i <= 5 )); do
        sleep 1
        printf '*'
    done
}

echo "Starting timer"
timer

echo "Exited timer"
echo "Doing other stuff...."

,这在ksh中(注意trap语句的不同位置):

#!/bin/ksh

function timer {

    trap "break" INT

    i=0
    while (( ++i <= 5 )); do
        sleep 1
        printf '*'
    done
}

echo "Starting timer"
timer

echo "Exited timer"
echo "Doing other stuff...."