Идиоматический способ выхода из цикла ksh while - PullRequest
1 голос
/ 12 декабря 2011

У меня есть следующие 5 секундный таймер, который печатает звездочку за каждую секунду.

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

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

Каким-то образом блок ловушек выглядит немного хакерским, и мне интересно, есть ли более правильный способ прервать весь цикл (а не только текущий цикл сна). Я пробовал:

trap 'print "foo"' INT

в различных местах внутри и снаружи функции, но, как я уже упоминал ранее, это просто прерывает текущий цикл ожидания.

Ответы [ 2 ]

0 голосов
/ 12 августа 2013

Это работает для меня в 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...."
0 голосов
/ 13 декабря 2011

Возможно, я что-то упускаю, но что не так с:

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