`cal -h`命令:Bash substring` $ {string:offset:length}`错误

要小心三月凯撒的Ides

我在bash中遇到一个奇怪的错误: ${string:offset:length}

三月中旬的第五条输出线输出错误:

 $ substring_test.sh March 2018 Su Mo Tu We Th Fr Sa 1 2 3 T= T= T= T= T= 1 T= 2 T= 3 4 5 6 7 8 9 10 T= 4 T= 5 T= 6 T= 7 T= 8 T= 9 T=10 11 12 13 14 15 16 17 T= T= T= 1 T= 1 T= 1 T= 1 T= 1 18 19 20 21 22 23 24 T=18 T=19 T=20 T=21 T=22 T=23 T=24 25 26 27 28 29 30 31 T=25 T=26 T=27 T=28 T=29 T=30 T=31 T= T= T= T= T= T= T= 

它显示:

 T= T= T= 1 T= 1 T= 1 T= 1 T= 1 

但它应该表明:

 T=11 T=12 T=13 T=14 T=15 T=16 T=17 

代码很简单:

 #!/bin/bash cal > /tmp/terminal CalLineCnt=1 Today=$(date +"%d") # Prefix with space when length < 2 if [[ ${#Today}  2 ]] ; then # See if today is on current line & invert background for (( j=0 ; j <= 18 ; j += 3 )) ; do Test=${Cal:$j:2} # Current day on calendar line printf "T=$Test " if [[ "$Test" == "$Today" ]] ; then printf "Offset: $j " fi done fi tput cud1 # Down one line CalLineCnt=$((++CalLineCnt)) done < /tmp/terminal 

谁能指出我正确的方向?


最终结果

应用下面推荐的cal -h修复工具,直到Ubuntu 18.04 LTS在2018年4月28日发布并测试完成后才能正常工作。现在使用@Steve H推荐的修复:

now.png

有些人对代码的作用感到好奇,所以我提供了上面的屏幕截图。 其他人要求提供完整的代码,可在此处获取 : 如何获得此终端启动画面?

你的问题是cal已经突出显示当天,并且控制代码正在抛弃偏移量

在hex编辑器中查看/tmp/terminal 。 今天(第11日)是: 5F 08 31 5F 08 31 ,而不是31 31

使用cal -h关闭今天日期的自动突出显示。

如果cal的所有实现实际上都将-h识别为关闭格式,那么@Martin Thornton就可以了。 尽管人们认为它确实存在,但Debian并没有。 它显示用法。 所以这会奏效。

 cal > /tmp/terminal1 tr -cd '\11\12\15\40\60-\136\140-\176' < /tmp/terminal1 > /tmp/terminal 

该文件使用格式化获取校准输出,下一行删除我们不想要的任何内容,并让其余代码完成其工作。