jak na datum v .sh

Dan Lukes dan at obluda.cz
Sun Jun 22 22:01:50 CEST 2003


Milan Cizek wrote:
> na to, jak to spravne zkombinovat, po dvouhodinovem (hruza :-)) badani
> jsem stvoril nasledujici, ale funguje to jen napul - t.j. cas i koncovka
> chybi. Zkousel jsem u ruzne kombinace s uvozovkama/apostrofama, co mam
> spatne? :( Dik
> 
> #!/bin/sh
> tar czvf backup-$(date +"%d.%m.%Y %H-%M").tar.gz /usr/local/etc/ /etc/


	Zdravim.

	Spravne jsi mezitim prisel na to, ze vadi mezera. Nespravne jsi ale 
vydedukoval, ze v nazvu souboru.

	Je to treba vzit trochu zesiroka:
tar ma spoustu ruznych optionu. Jeden z nich je take option 'f' za 
kterym se ocekava nazev zarizeni nebo souboru, to ktereho se ma archiv 
vytvorit. Ten nazev musi byt prave jeden.

Standardnim oddelovacem parametru na prikazove radce je mezera.

A ted se vratme se k tvemu problemu.

date +"%d.%m.%Y %H-%M" po svem spusteni vraci neco takoveho:
22.06.2003 21-42

takze prepisme jak vypada cely prikaz po expanzi tohoto data:
tar czvf backup-22.06.2003 21-42.tar.gz /usr/local/etc/ /etc/

Receno lidskym jazykem - prejeme si vytvorit GZIPem pakovany archiv se 
jmenem backup-22.06.2003 (to je prvni parametr za 'f') a prejeme si to 
jen umistit nasledujici soubory a adresare: 21-42.tar.gz /usr/local/etc/ 
/etc/  (ten prvni patrne neexistuje)

Shell neni delfska vestirna - neni schopen rozeznat, ze jedna z mezer na 
prikazovem radku neznamena oddelovac, nybrz je soucasti jmena souboru.


	Takze, jak z toho ?

	Potrebujeme nejak rict, ze tato konkretni mezera neni oddelovacem 
parametru, ale je obycejnou mezerou - jinymi slovy, chceme zrusit jeji 
specialni vyznam. Mezera ztraci svuj specialni vyznam v zasade tremi 
zpusoby - tim, ze pred ni dame backslash, nema ho, pokud je soucasti 
retezce delimitovaneho uvozovkami a nema ho, pokud je soucasti retezce 
delimitovaneho apostrofy.

	Uzavreni do apostrofu se nam v tomto pripade nehodi, protoze v 
apostrofech by nam ztratil svuj specialni vyznam i '$' a prestal by nam 
chodit konstrukt $(...).

	Prvni zpusob pouzit muzeme:
tar czvf backup-$(date +"%d.%m.%Y\ %H-%M").tar.gz /usr/local/etc/ /etc/

	date nam tak vygeneruje datum s mezerou vcetne potrebneho backslashe 
pred ni

	Druhy zpusob take pouzit muzeme:
tar czvf "backup-$(date +'%d.%m.%Y %H-%M').tar.gz" /usr/local/etc/ /etc/

	nazev obsahujici mezeru je uzavren v uvozovkach, takze je zrejme, ze 
mezera nemuze byt oddelovacem. Vsimni si, ze u date jsem uvozovky 
nahradil apostrofy - to abych se vyhnul problemum s uvozovkami v 
uvozovkach (ne, ze by to byl problem neresitelny, ale proc si 
komplikovat zivot ...)


	Doufam, ze takhle ti to pomuze (i kdyz je to dlouhe) vic, nez kdybych 
ti napsal jen samotny jeden opraveny radek.

	Mimochodem, zkus uvazit, jestli by nestalo zato nekde trochu nastudovat 
jak funguje prikazova radka v sh - je to pomerne zaklad toho, co dost 
nutne potrebujes, respektive, usetris si strasne mnozstvi problemu, 
pokud si s timhle budes tykat ...


						Dan





More information about the Users-l mailing list