3초마다 변수를 1씩 증가시키고 싶습니다. bash를 사용하여 이를 수행할 수 있는 방법이 있습니까?
변수를 사용하여 작업을 수행하는 무한 루프에서 실행되는 프로그램이 있습니다. 예를 들어 3초마다 변수를 증가시키고 싶습니다. 수면을 사용하면 안 됩니다.
답변1
에서는 기능의 소스 와 마찬가지로 특수 변수가 이미 매초마다 증가합니다 bash
.$SECONDS
ksh
$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
type
ksh93에서는 다음과 같이 매초마다 숫자가 증가하는 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