Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: martin.nohejl 01 Května 2015, 18:32:36
-
Potřeboval bych provádět operace s proměnnou obsahující datum:
např.:
DATUM1=14.3.2015
DEN=5
DATUM2=$(($DATUM1+$DEN))
echo $DATUM2
Potřebuju ,aby v proměnné DATUM2 bylo 19.3.2015, ale již při zadávání DATUM2=$(($DATUM1+$DEN)) mi to zahlásí:
bash: 14.3.2015+5: syntaktická chyba: chybný aritmetický operátor (chybný token je „.3.2015+5“)
-
Tohle už vypadá jako domácí úkol...
http://superuser.com/questions/45592/how-to-add-a-day-to-date-in-bash
-
No úplně jsem to z toho nepochopil. Když zadám:
$ date -d "1983-08-04 348 days"
tak mi to vypíše:
$: příkaz nebyl nalezen
Když zadám:
$date -d "1983-08-04 348 days"
tak mi to vypíše:
-d: příkaz nebyl nalezen
-
No úplně jsem to z toho nepochopil. Když zadám:
$ date -d "1983-08-04 348 days"
tak mi to vypíše:
$: příkaz nebyl nalezen
Když zadám:
$date -d "1983-08-04 348 days"
tak mi to vypíše:
-d: příkaz nebyl nalezen
LenostHledat++; Ten dolarový znak na začátku znamená, že příkaz nepotřebuje oprávnění roota - je to pouze informativní znak pro lidi.
date -d "1983-08-04 348 days"
-
Plus je tam ještě možnost formátování výstupu, takže tvůj příklad by mohl vypadat třeba takto:
date -d "20150314 + 5 days" "+%d.%m.%Y"
-
LenostHledat++; Ten dolarový znak na začátku znamená, že příkaz nepotřebuje oprávnění roota - je to pouze informativní znak pro lidi.
Jo jsem to ale blbec, to jsem si neuvědomil.
A pokud bych chtěl do vstupu dát formát den měsíc rok?
-
LenostHledat++; Ten dolarový znak na začátku znamená, že příkaz nepotřebuje oprávnění roota - je to pouze informativní znak pro lidi.
Jo jsem to ale blbec, to jsem si neuvědomil.
A pokud bych chtěl do vstupu dát formát den měsíc rok?
Plus je tam ještě možnost formátování výstupu, takže tvůj příklad by mohl vypadat třeba takto:
date -d "20150314 + 5 days" "+%d.%m.%Y"
Plus ještě:
https://www.phil.muni.cz/~letty/linuxfaq/66-date.html
http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ - dole je přehledná tabulka zkratek
http://unixhelp.ed.ac.uk/CGI/man-cgi?date
-
No tak když to shrnu:
-skript můžu napsat takto:
#!/bin/sh
DATUM1=2015-03-14
DEN=5
DATUM2=$(date -d "$DATUM1 $DEN days" "+%d.%m.%Y")
echo $DATUM2
Pak ale nevím, jak to udělat, když proměnnou DATUM1 budu načítat s texťáku, ve kterém budu mít datum uveden d.m.r (tzn.14.3.2015).
Odkazy viz níže spíš upravují výstup a já potřebuji upravit vstup. Nebo aspoň nevím, jak těch odkazů využít.
https://www.phil.muni.cz/~letty/linuxfaq/66-date.html
http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ - dole je přehledná tabulka zkratek
http://unixhelp.ed.ac.uk/CGI/man-cgi?date
-
Googluj sed replace, stačí vyměnit . za -
-
Vyměnit . za - umím, ale ještě pořadí.
-
No tak jsem to nakonec vymyslel takto:
#!/bin/sh
DMRDAT1=14.3.2015
RMDDAT1=$(echo $DMRDAT1 | tr "." " " | awk '{ print $3"-"$2"-"$1 }')
DEN=5
DMRDATUM2=$(date -d "$RMDDAT1 $DEN days" "+%d.%m.%Y")
echo $DMRDATUM2
Nevím sice, jestli to je ideální řešení, ale funguje to.
-
Lze to trochu zjednodušit, awk umí všechno, co potřebuješ.
awk 'BEGIN {FS="[^0-9]"}; {print $3"-"$2"-"$1}'
Proměnná FS obsahuje řetězec, který jednotlivá pole odděluje. Lze použít i regulární výrazy, v tomto případě jsem definoval, že oddělovačem bude jakýkoliv znak, který není číslem.
Pro zajímavost ještě ten sed:
sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3-\2-\1/'
s GNU sed, který je v ubuntu, lze vynechat nějaké ty escape znaky:
sed -r 's/([0-9]*).([0-9]*).([0-9]*)/\3-\2-\1/'