#!/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