Bash Shell脚本中的时间计数器

Bash Shell脚本中的时间计数器,bash,shell,Bash,Shell,我想在while循环中每2秒执行一个命令,每5秒执行一个命令 start while [ 1 ] do if [ time diff == 2] do sth fi if [ time diff == 5] do sth else fi end dif = end - start 但当差值为0时,这是一个小问题。 如何在shell脚本中执行类似操作 试试这个: while true; do sth ; sleep 2 ; done 您可以使用子shell: #!/bin/bas

我想在while循环中每2秒执行一个命令,每5秒执行一个命令

start
while [ 1 ]
do
if [ time diff == 2]
   do sth
fi 
if [ time diff == 5]
   do sth else
fi
end
dif = end - start
但当差值为0时,这是一个小问题。 如何在shell脚本中执行类似操作

试试这个:

while true; do sth ; sleep 2 ; done
您可以使用子shell:

#!/bin/bash

(while true ; do echo time2 ; sleep 2 ; done)&
(while true ; do echo time5 ; sleep 5 ; done)
但是,您以后必须做一些事情来终止后台子shell。

尝试以下方法:

while true; do sth ; sleep 2 ; done
您可以使用子shell:

#!/bin/bash

(while true ; do echo time2 ; sleep 2 ; done)&
(while true ; do echo time5 ; sleep 5 ; done)
但是,您以后必须做一些事情来杀死后台子shell。

尝试
睡眠

while true
do
  ..
  sleep 2
done
尝试
sleep

while true
do
  ..
  sleep 2
done

可能最简单的方法是这样的10秒循环!(因为10是2和5的最小公分母)

不过这有点疯狂


当然,这假设命令是即时的,您可能希望使用
&

作为它们的背景,最简单的方法可能是这样的10秒循环!(因为10是2和5的最小公分母)

#!/bin/bash
#
rhythm () {

    beat1=$1
    beat2=$2
    tick=0
    while [ 1 ]
    do
        (( tick % $beat1)) || echo a
        (( tick % $beat2)) || echo b
        tick=$(((tick+1)%(beat1*beat2)))
        sleep 1
    done 
}

rhythm 2 5 
不过这有点疯狂

当然,这假设命令是即时的,您可能希望使用
&

#!/bin/bash
#
rhythm () {

    beat1=$1
    beat2=$2
    tick=0
    while [ 1 ]
    do
        (( tick % $beat1)) || echo a
        (( tick % $beat2)) || echo b
        tick=$(((tick+1)%(beat1*beat2)))
        sleep 1
    done 
}

rhythm 2 5 
当然,这只适用于2个参数,如果示例中的echo/real命令中的real命令所消耗的时间无关紧要


当然,这只适用于2个参数,如果示例/real命令中的echo消耗的时间不重要。

如果您想非常彻底,可以将此作为起点

#!/bin/bash

declare -a JOBPIDS

function repeatbackground()
{
    local delay="$1"
    shift
    (
        while true
        do
            sleep "$delay" || return 0 # abort on sleep interrupted
            eval "$@"
        done
    )&
    JOBPIDS=( ${JOBPIDS[@]-} $! )
}

function signalbackgroundtasks()
{
    for bgpid in "${JOBPIDS[@]}"
    do
        kill -TERM "$bgpid" || echo "Job $bgpid already vanished"
    done
    JOBPIDS=( )
}

trap "signalbackgroundtasks; exit 0" EXIT
repeatbackground 2 echo "by the other way"
repeatbackground 5 echo the other background job

echo "Running background jobs ${JOBPIDS[@]}"
wait
exit 0

如果你想做得非常彻底,你可以以此为出发点

#!/bin/bash

declare -a JOBPIDS

function repeatbackground()
{
    local delay="$1"
    shift
    (
        while true
        do
            sleep "$delay" || return 0 # abort on sleep interrupted
            eval "$@"
        done
    )&
    JOBPIDS=( ${JOBPIDS[@]-} $! )
}

function signalbackgroundtasks()
{
    for bgpid in "${JOBPIDS[@]}"
    do
        kill -TERM "$bgpid" || echo "Job $bgpid already vanished"
    done
    JOBPIDS=( )
}

trap "signalbackgroundtasks; exit 0" EXIT
repeatbackground 2 echo "by the other way"
repeatbackground 5 echo the other background job

echo "Running background jobs ${JOBPIDS[@]}"
wait
exit 0

以下内容不使用特定于bash的特性或子shell,易于推广:

set 1 2 3 4 5
while :; do
  sleep 1
  shift  
  case $1 in
    2|4) echo "every 2 seconds" ;;
    5)   echo "every 5 seconds" ; set 1 2 3 4 5 ;;
  esac
done  

以下内容不使用特定于bash的特性或子shell,易于推广:

set 1 2 3 4 5
while :; do
  sleep 1
  shift  
  case $1 in
    2|4) echo "every 2 seconds" ;;
    5)   echo "every 5 seconds" ; set 1 2 3 4 5 ;;
  esac
done  


我知道,但在while循环中,我有两个与时间相关的部分。一个应该每2秒运行一次,另一个可以说是5秒。@tux4您可能应该在实际问题中说明这一点。我可以用Python来做…我改变了我的问题。我也能用c写。但是我不太懂脚本语法。@thetux:我想你可能没有注意到尾随的“&”使部分同时运行。我知道,但是在while循环中,我有两个时间相关的部分。一个应该每2秒运行一次,另一个可以说是5秒。@tux4您可能应该在实际问题中说明这一点。我可以用Python来做…我改变了我的问题。我也能用c写。但是我不太懂脚本语法。@thetux:我想你可能没有注意到尾随的“&”使部分同时运行。实际上2和5在变化,它们是变量。我写了简单2和5。也许我可以尝试增加一个变量,比如计数器来检测时间。实际上2和5在变化,它们是变量。我写了简单2和5。也许我可以尝试增加一个变量,比如计数器来检测时间。坦率地说,这是有问题的,也有与问题相匹配的工具。使用匹配的工具。为此,与Bourne兼容的shell可能不是合适的工具。
小问题是什么?还有一点别的吗?您没有else,但这只是伪代码,名称不匹配(开始:startTime、endTime、end)。如果您试图理解伪代码,那么您将了解问题所在。您可能希望在测试“while[1]”时小心虽然[0]'的行为方式相同,而且写“while true”更清楚坦率地说,存在问题,也存在与这些问题相匹配的工具。使用匹配的工具。为此,与Bourne兼容的shell可能不是合适的工具。
小问题是什么?还有一点别的吗?您没有else,但这只是伪代码,名称不匹配(开始:startTime、endTime、end)。如果您试图理解伪代码,那么您将了解问题所在。您可能希望在测试“while[1]”时小心而[0]”的行为方式相同,写“while true”更清晰