Views:
745ā
Votes: 5ā
ā
Solution
Tag :
bash
Link:
š See Original Question on Ask Ubuntu ā§ š
URL:
https://askubuntu.com/q/1013954
Title:
`cal -h` command: Bash substring `${string:offset:length}` error
ID:
/2018/03/11/_cal-h_-command_-Bash-substring-___string_offset_length__-error
Created:
March 11, 2018
Edited: April 29, 2018
Upload:
September 15, 2024
Layout: post
TOC:
false
Navigation: false
Copy to clipboard: false
Beware the Ides of March Caesar
Iām getting a weird error in bash using: ${string:offset:length}
.
The fifth output line for the middle of March has the wrong output:
$ 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=
It is showing:
T= T= T= 1 T= 1 T= 1 T= 1 T= 1
But it should show:
T=11 T=12 T=13 T=14 T=15 T=16 T=17
The code is pretty straight forward:
#!/bin/bash
cal > /tmp/terminal
CalLineCnt=1
Today=$(date +"%d")
# Prefix with space when length < 2
if [[ ${#Today} < 2 ]] ; then
Today=" "$Today
fi
while IFS= read -r Cal; do
printf "$Cal"
if [[ $CalLineCnt > 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
Can anyone point me in the right direction?
End Result
Applying fix of cal -h
recommended below it worked fine until Ubuntu 18.04 LTS was released and tested on April 28, 2018. Now the fix recommended by @Steve H is used:
Some are curious about the what the code does so I provided the screen shot above. Others have asked for the full code and it is available here:How can I get this terminal splash screen?