Я получаю странную ошибку в использовании удара: ${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
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
Кто-либо может указать на меня в правильном направлении?
Применение фиксирует cal -h
рекомендуемый ниже его хорошо работал до Ubuntu 18.04 LTS был выпущен и протестирован 28 апреля 2018. Теперь фиксация, рекомендуемая @Steve H, используется:
Некоторым любопытно на предмет, что код делает так, я предоставил снимок экрана выше. Другие попросили полный код, и это - доступный here:How, я могу получить этот терминальный экран-заставку?
Ваша проблема - это cal
уже выделяет текущий день, и коды управления отбрасывают смещения
Посмотрите на /tmp/terminal
в Hex-редакторе. Сегодня (11-е): 5F 08 31 5F 08 31
, и нет 31 31
Использовать cal -h
выключать автоматическое выделение сегодняшней даты.
@Martin Thornton был бы в порядке, если бы все реализации cal фактически распознавали -h как отключающее форматирование. Debian этого не делает, даже если человек предполагает это. Вместо этого отображается использование. Так что это будет работать.
cal > /tmp/terminal1
tr -cd '\11\12\15\40\60-\136\140-\176' < /tmp/terminal1 > /tmp/terminal
Файл получает результат калибровки с форматированием, а следующая строка удаляет все, что нам не нужно, и позволяет остальной части кода работать.