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 にあります (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...."
于 2013-08-12T15:54:59.770 に答える
0

おそらく私は何かを見逃していますが、何が問題なのですか:

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