Bash 스크립트에서 적시에 변수 추가

Bash 스크립트에서 적시에 변수 추가

3초마다 변수를 1씩 증가시키고 싶습니다. bash를 사용하여 이를 수행할 수 있는 방법이 있습니까?

변수를 사용하여 작업을 수행하는 무한 루프에서 실행되는 프로그램이 있습니다. 예를 들어 3초마다 변수를 증가시키고 싶습니다. 수면을 사용하면 안 됩니다.

답변1

에서는 기능의 소스 와 마찬가지로 특수 변수가 이미 매초마다 증가합니다 bash.$SECONDSksh

$SECONDS쉘이 시작될 때(또는 환경 변수가 있는 경우 환경 변수 값 에서) 0으로 초기화되지만 해당 값을 수동으로 설정할 수도 있습니다.

그러나 bash구현은 (동일한 버그가 있었지만 보고한 이후 수정된 ksh93, mksh 또는 zsh의 구현과 반대) 다음과 같습니다.부서진시스템 시계는 정확한 두 번째 표시를 통과할 때 증가하기 때문입니다.

따라서 12:00:00.1 또는 12:00:00.9로 설정하면 12:00:01 0로 변경됩니다 1(즉, 첫 번째 경우에는 9/10초, 두 번째 경우에는 9/10초, 1/10초).

대신 zsh, mksh 또는 ksh93을 사용할 수 있습니다.

$((SECONDS*3))그런 다음 매초마다 3씩 증가하는 것을 사용하거나 $((SECONDS/3))3초마다 1씩 증가하는 것을 사용합니다 .

에서는 임의 변수에 대한 규칙을 다음과 같이 정의 ksh93할 수 있습니다 .get$((SECONDS*3))

#! /bin/ksh93 -
var.get() {
  .sh.value=$((int(SECONDS*3)))
}
SECONDS=0

# testing:
echo "$var"; sleep 1; echo "$var"

다음을 제공합니다:

0
3

typeksh93에서는 다음과 같이 매초마다 숫자가 증가하는 of 변수를 정의할 수 있습니다 .

#! /bin/ksh93 -
SECONDS=0
typeset -T auto_incremented=(
  typeset -F start
  typeset -i initial=0
  typeset -i increment=1
  function get {
    .sh.value=$((_.initial + int((SECONDS - _.start) * _.increment)))
  }
  function create {
    ((_.start = SECONDS))
  }
  function set {
    _.initial=${.sh.value}
    ((_.start = SECONDS))
  }
)

# testing:
auto_incremented var
var.increment=2

echo "$var"; sleep 2; echo "$var"

var=10; echo "$var"; sleep 2; echo "$var"

여기에 주어진:

0
4
10
14

ksh에서 많은 기능이 복사 되지만 bash복사되지는 않습니다.주제,유형또는 부동 소수점 숫자 $SECONDS.

취할 수 있는 한 가지 접근 방식 bash은 매초마다 신호를 보내고 bash설치하는 백그라운드 프로세스를 실행하는 것입니다.변수를 업데이트하는 신호에서 예를 들면 다음과 같습니다.

#! /bin/bash -
var=0 SECONDS=0; trap '((var = SECONDS * 3))' ALRM

ksh93 -c '
  t=0 SECONDS=0
  while
    sleep "$((++t - SECONDS))" && kill -s ALRM -- "$1" 2> /dev/null
  do
    : nothing
  done' ksh "$$" &

# testing:
echo "$var"; sleep 2; echo "$var"

$var트랩은 내장되지 않은 명령 사이에서만 처리되기 때문에 트랩 핸들러를 추가할 수 없으며 명령 중 하나가 1초 이상 걸리고 그 동안 여러 SIGALRM 신호를 보내는 경우 하나의 핸들러만 추가됩니다. 전송된.

ksh93여기서는 매초 신호를 보내기 위해 인라인 스크립트를 사용하고 있지만 가능하다면 대신 zsh, perl, ...를 사용할 수도 있습니다.python

답변2

끔찍한 해결책:

#!/bin/bash
somevar=0
somefile=$(mktemp)
echo "$somevar" > "$somefile"
while true; do sleep 3; ((somevar++)); echo "$somevar" > "$somefile" ;done &

  while true; do

    sleep 1
    avar="$(cat "$somefile")"
    echo "my var has value $avar"

  done

물론 시대에 뒤처지지 않고 실시간으로 준비되지도 않습니다.

답변3

아래는 코드입니다

 i=10
    for ((j=1;j<=count_of_sequence;j++)); do echo $i; sleep 10;i=$(($i+1)); done

산출

10
11
12
13
14

관련 정보