Bash Shell脚本中的时间计数器
我想在while循环中每2秒执行一个命令,每5秒执行一个命令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
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”更清晰