1

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

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

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

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

trap 'print "foo"' INT

在函数内部和外部的不同位置,但正如我之前提到的,这只会中断当前的睡眠周期。

4

2 回答 2

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 中(注意陷阱语句的不同位置):

#!/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...."
于 2013-08-12T15:54:59.770 回答
0

也许我错过了一些东西,但是有什么问题:

timer() {
  i=0
  while (( ++i <= 5 )); do
    sleep 1
    printf '*'
  done
}
于 2011-12-13T17:00:49.700 回答