一、实验原理:
随着 Linux 的广泛使用,对时间编程提出了更高的要求。实时应用、多媒体软件对时钟和定时器的精度要求不断提高,在早期 Linux 内核中,定时器所能支持的最高精度是一个 tick。为了提高时钟精度,人们只能提高内核的 HZ 值 (一个内核参数,代表内核时钟中断的频率)。更高的 HZ 值,意味着时钟中断更加频繁,内核要花更多的时间进行时钟处理。
#!/bin/bash
#功能描述(Description):通过tput定位光标,在屏幕特定位置打印当前的计算机时间.
#使用Ctrl+C中断脚本时显示光标.
trap 'tput cnorm;exit' INT
#定义数组变量,该数组有9行9个元素,每行是1个元素,每一个数字宽度占用12列.
#循环对数组9个元素进行字串截取,每一个元素提取0-11位就是数字0,
#循环对数组9个元素进行字串截取,每一个元素提取12-23位就是数字1,依此类推.
number=(
' 0000000000 111 2222222222 3333333333 44 44 5555555555 6666666666 777777777 888888888 9999999999 '
' 00 00 11111 22 33 44 44 55 66 77 77 88 88 99 99 '
' 00 00 111111 22 33 44 44 55 66 77 77 88 88 99 99 '
' 00 00 11 22 33 44 44 55 66 77 88 88 99 99 '
' 00 00 11 2222222222 3333333333 44444444444 5555555555 6666666666 77 888888888 9999999999 '
' 00 00 11 22 33 44 55 66 66 77 88 88 99 '
' 00 00 11 22 33 44 55 66 66 77 88 88 99 '
' 00 00 11 22 33 44 55 66 66 77 88 88 99 '
' 0000000000 1111111111 2222222222 3333333333 44 5555555555 6666666666 77 888888888 9999999999 '
)
#获取计算机时间,并分别提取个位和十位数字.
now_time(){
hour=$(date +%H)
min=$(date +%M)
sec=$(date +%S)
hour_left=`echo $hour/10 | bc`
hour_right=`echo $hour%10 | bc`
min_left=`echo $min/10 | bc`
min_right=`echo $min%10 | bc`
sec_left=`echo $sec/10 | bc`
sec_right=`echo $sec%10 | bc`
}
#定义函数:打印数组中的某一个数字.
print_time(){
#从第几个位置开始提取数组元素,数字0就从0开始,数字1就从12开始,数字2就从24开始,依此类推.
begin=$[$1*12]
for i in `seq 0 ${#number[@]}` #0-9的循环.
do
tput cup $[i+5] $2 #定位光标
echo -en "\033[32m${number[i]:$begin:12}\033[0m"
done
}
#打印时间分隔符,echo通过\u可以支持unicode符号.
#unicode编码中2588是一个方块.
print_punct(){
tput cup $1 $2
echo -en "\e[32m\u2588\e[0m"
}
#依次打印小时,分钟,秒(个位和十位分别打印).
while :
do
tput civis #隐藏光标.
now_time
print_time $hour_left 2 #需要打印的数字以及X轴坐标(第几列).
print_time $hour_right 14
print_punct 8 28 #定义(Y,X)坐标位8,28,打印时间分隔符号.
print_punct 10 28
print_time $min_left 30
print_time $min_right 42
print_punct 8 56
print_punct 10 56
print_time $sec_left 58
print_time $sec_right 70
echo
sleep 1
done
二、运行结果