parent
91da5c1565
commit
5c2bcb9fca
@ -0,0 +1,153 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# datum_tabulka.sh
|
||||
# Vykresli ramecek s aktualnim datem/casem v cestine.
|
||||
#
|
||||
# Kompatibilita: bash 3.2+ (RHEL 5), coreutils/GNU sed jak jsou
|
||||
# soucasti RHEL 5 a Debian Squeeze a novejsich. Nepouziva se zadny
|
||||
# bashismus specificky pro bash 4+ (asociativni pole, ${var,,}, ...).
|
||||
#
|
||||
# POUZITI:
|
||||
# 1) Spusteni jako samostatny skript:
|
||||
# bash datum_tabulka.sh
|
||||
#
|
||||
# 2) "Nasourcovani" do interaktivniho shellu (napr. z ~/.bashrc),
|
||||
# cimz se ziska prikaz "datum":
|
||||
# echo 'source /cesta/k/datum_tabulka.sh' >> ~/.bashrc
|
||||
# Po novem prihlaseni (nebo "source ~/.bashrc") pak staci
|
||||
# napsat v terminalu:
|
||||
# datum
|
||||
#
|
||||
# Pri sourcovani se nic samo nespusti - jen se definuje funkce
|
||||
# "datum". Pri primem spusteni ("bash datum_tabulka.sh") se funkce
|
||||
# rovnou i zavola.
|
||||
|
||||
# Pomocne funkce jsou prefixovany "_datum_", aby pri sourcovani do
|
||||
# interaktivniho shellu nekolidovaly se jmeny jinych funkci/prikazu.
|
||||
|
||||
# Delka retezce v "znacich" (ne bajtech), nezavisla na locale:
|
||||
# odstranime UTF-8 pokracovaci bajty (0x80-0xBF) a spocitame bajty,
|
||||
# ktere zbyly - to odpovida poctu znaku bez ohledu na nastaveni LANG.
|
||||
_datum_mb_len() {
|
||||
printf '%s' "$1" | LC_ALL=C sed 's/[\x80-\xBF]//g' | LC_ALL=C wc -c | tr -d ' '
|
||||
}
|
||||
|
||||
# Zopakuje znak $1 celkem $2 krat
|
||||
_datum_repeat_char() {
|
||||
local ch="$1"
|
||||
local count="$2"
|
||||
local out=""
|
||||
local i=0
|
||||
while [ "$i" -lt "$count" ]; do
|
||||
out="${out}${ch}"
|
||||
i=$((i + 1))
|
||||
done
|
||||
printf '%s' "$out"
|
||||
}
|
||||
|
||||
# Hlavni funkce - vypise tabulku s aktualnim datem/casem
|
||||
datum() {
|
||||
# --- Ceske nazvy mesicu (2. pad) a dnu v tydnu -------------------
|
||||
# index 0 je jen vycpavka, aby indexy odpovidaly cislu mesice/dne
|
||||
local mesice
|
||||
mesice=(x ledna února března dubna května června července srpna září října listopadu prosince)
|
||||
local dny
|
||||
dny=(x Pondělí Úterý Středa Čtvrtek Pátek Sobota Neděle)
|
||||
|
||||
# --- Nacteni zivych dat jednim volanim date, aby byla konzistentni
|
||||
# %Y rok, %m mesic, %d den, %H hodina, %M minuta, %Z zkratka pasma,
|
||||
# %u den v tydnu (1=po..7=ne), %V ISO tyden, %j den v roce, %s epoch
|
||||
local rok mesic den hod min pasmo dow tyden denroku epoch
|
||||
set -- $(date +"%Y %m %d %H %M %Z %u %V %j %s")
|
||||
rok=$1
|
||||
mesic=$2
|
||||
den=$3
|
||||
hod=$4
|
||||
min=$5
|
||||
pasmo=$6
|
||||
dow=$7
|
||||
tyden=$8
|
||||
denroku=$9
|
||||
epoch=${10}
|
||||
|
||||
# --- Prevod cisel bez uvodnich nul (aby se neinterpretovaly jako 8)
|
||||
local den_n mesic_n dow_n tyden_n denroku_n
|
||||
den_n=$((10#$den))
|
||||
mesic_n=$((10#$mesic))
|
||||
dow_n=$((10#$dow))
|
||||
tyden_n=$((10#$tyden))
|
||||
denroku_n=$((10#$denroku))
|
||||
|
||||
# --- Kvartal --------------------------------------------------------
|
||||
local kvartal
|
||||
kvartal=$(( (mesic_n - 1) / 3 + 1 ))
|
||||
|
||||
# --- Obsahove radky tabulky ------------------------------------------
|
||||
local radek1 radek2 radek3 radek4 radek5 radek6 radek7
|
||||
radek1="${den_n}. ${mesice[$mesic_n]} ${rok}"
|
||||
radek2="${dny[$dow_n]}, ${tyden_n}. týden"
|
||||
radek3="${hod}:${min} ${pasmo}"
|
||||
radek4=""
|
||||
radek5="Q${kvartal}, ${denroku_n}. den v roce"
|
||||
radek6=""
|
||||
radek7="Unix čas: ${epoch}"
|
||||
|
||||
# --- Vypocet sirky tabulky (podle nejdelsiho radku + fixni pridani) -
|
||||
# Sirka je vypoctena z nejdelsiho radku a pak natrvalo rozsirena o 5
|
||||
# znaku. Protoze extra_sirka je konstanta, je vysledna sirka tabulky
|
||||
# fixni napric spustenimi (meni se jen kvuli delce textu samotneho).
|
||||
local extra_sirka=5
|
||||
local max=0
|
||||
local radek l
|
||||
for radek in "$radek1" "$radek2" "$radek3" "$radek4" "$radek5" "$radek6" "$radek7"; do
|
||||
l=$(_datum_mb_len "$radek")
|
||||
if [ "$l" -gt "$max" ]; then
|
||||
max=$l
|
||||
fi
|
||||
done
|
||||
max=$((max + extra_sirka))
|
||||
|
||||
# --- Vykreslovaci funkce (lokalni pres subshell, aby nezustaly) ------
|
||||
_datum_print_border() {
|
||||
local left="$1"
|
||||
local right="$2"
|
||||
printf '%s' "$left"
|
||||
_datum_repeat_char "─" $((max + 2))
|
||||
printf '%s\n' "$right"
|
||||
}
|
||||
|
||||
_datum_print_line() {
|
||||
local text="$1"
|
||||
local len
|
||||
len=$(_datum_mb_len "$text")
|
||||
local pad=$((max - len))
|
||||
printf '│ %s' "$text"
|
||||
_datum_repeat_char " " "$pad"
|
||||
printf ' │\n'
|
||||
}
|
||||
|
||||
# --- Vykresleni tabulky ---------------------------------------------------
|
||||
_datum_print_border "┌" "┐"
|
||||
_datum_print_line "$radek1"
|
||||
_datum_print_border "├" "┤"
|
||||
_datum_print_line "$radek2"
|
||||
_datum_print_line "$radek3"
|
||||
_datum_print_line "$radek4"
|
||||
_datum_print_line "$radek5"
|
||||
_datum_print_line "$radek6"
|
||||
_datum_print_border "├" "┤"
|
||||
_datum_print_line "$radek7"
|
||||
_datum_print_border "└" "┘"
|
||||
|
||||
# uklid pomocnych funkci definovanych uvnitr datum(), aby se
|
||||
# neplichtily do jmenneho prostoru interaktivniho shellu
|
||||
unset -f _datum_print_border _datum_print_line
|
||||
}
|
||||
|
||||
# --- Spusteni jen pri primem volani skriptu, ne pri sourcovani -----------
|
||||
# Pokud je soubor sourcovan (napr. z ~/.bashrc), pouze se definuje
|
||||
# funkce "datum" a nic se nevypisuje. Pokud je soubor spusten primo
|
||||
# (bash datum_tabulka.sh), funkce se rovnou zavola.
|
||||
if [ "${BASH_SOURCE[0]}" = "${0}" ]; then
|
||||
datum
|
||||
fi
|
||||
Loading…
Reference in new issue