Portál AbcLinuxu, 15. května 2025 15:10

Dotaz: Bash: Spravny zapis hodnoty premennej

31.10.2010 10:35 Patrik Uhrak | skóre: 31 | blog: pato
Bash: Spravny zapis hodnoty premennej
Přečteno: 277×
Odpovědět | Admin

Zdravim.

Snazim sa o spravny zapis v tomto pripade:

#! /bin/bash
DATE="$(which date)"

NOW_CMD="$DATE +%s"
TODAY_CMD="$DATE +%F"
TOMORROW_CMD="$DATE -d tomorrow +%F"
# potialto je to v poriadku

# toto uz ale v poriadku nie je
SINCE="$DATE "$($TODAY_CMD) ${1}" +%s"

Potrebujem dostat vzdy aktualny cas v cykle a preto takto. Ci je to ten najidealnejsi sposob, neviem, ale ...

Vysledok vyssie uvedeneho prikladu je takyto:

pato@debian:~$ bash -x ./test.bash 15:00
++ which date
+ DATE=/bin/date
+ NOW_CMD='/bin/date +%s'
+ TODAY_CMD='/bin/date +%F'
+ TOMORROW_CMD='/bin/date -d tomorrow +%F'
++ /bin/date +%F
+ SINCE='/bin/date 2010-10-31'
+ '15:00 +%s'
./test.bash: line 50: 15:00 +%s: command not found

Ako ho donutit, aby to 15:00 bral ako vstup pre date a nie ako novy prikaz? Tusim v kostiach, ze to bude trivialne, ale mna tu nic nenapada momentalne. Dakujem.


Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

David Watzke avatar 31.10.2010 11:38 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Spravny zapis hodnoty premennej
Odpovědět | | Sbalit | Link | Blokovat | Admin
I kdybyste to zapsal správně, snažíte se spouštět něco jako
$ date "2010-10-31 15:00" +%s
date: nadbytečný operand „+%s“
Více informací získáte příkazem „date --help“.
což nedává smysl. Můžete to nejdřív objasnit?
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
31.10.2010 13:08 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: Bash: Spravny zapis hodnoty premennej

Presne, ja tomu rozumiem, co sa tam deje. Moj problem je, ako takemuto chovaniu zabranit/predist? Keby ste uvodzil hodnoty pre date, aby sa chovali ako jeden retazec, tak by dal spravny vysledok. Ako toto ale aplikovat do mojho postupu z prveho prispevku?

31.10.2010 13:44 mato
Rozbalit Rozbalit vše Re: Bash: Spravny zapis hodnoty premennej
tak ako hore uviedol david, musis potom pastnut vacsiu cast scriptu alebo aspon zistit a povedat co je logika scriptu .. tie tvoje ""treba escapnut, alebo prepisat na:

DATE="`which date`"             # ; just in case

NOW_CMD="`$DATE +%s`"
TODAY_CMD="`$DATE +%F`"
TOMORROW_CMD="`$DATE -d tomorrow +%F`"

SINCE="`$DATE $($TODAY_CMD $1) +%s`"
pricom tie uvodzovky su tam pre istotu, keby naahodou date cmd bol v nestandardnej ceste, napr /usr/very\ nasty\ location/bin

pricom "2010-10-31 15:00" je blbost

31.10.2010 14:42 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: Bash: Spravny zapis hodnoty premennej

Dakujem za prispevok, ale mam par pripomienok:

1. Co je blbost na tomto: "2010-10-31 15:00" ?

Skus toto:

date --date "2010-10-31 15:00" +%s

2. Ako escapujes ty? Lebo ja ziadne escapovanie nevidim v tvojej uprave.

3. V podstate si prepisal com som dal ja a plus jedna chyba. (ale to sa mi hovori, ked ja som mal vo svojom skriptu od zaciatku)

K tej chybe, toto je tvoje:

SINCE="`$DATE $($TODAY_CMD $1) +%s`"

co sa da zapisat aj takto:

SINCE="$(date --date $(date +%F 15:00) +%s)"

Spravne to je v mojom rieseni, je nutne prv vykonat date +%F a az potom pridat 15:00 k tomu. ;)

 

Toto je o tom prepisani vlastne;

VAR1="`date +%s`"
VAR2="$(date +%s)"
echo "$VAR1"
echo "$VAR2"

Tie sposoby zapisu su totiz ekvivalentom. Akurat ten druhy je lepsie citatelny a je mozne vnorovat dalsie a dalsie prikazy. Vid vlastne moje riesenie tejto temy. ;)

 

Kazdopadne, ziadna zast ani cokolvek ineho necitim. Snazil si sa pomoct, cenim si to a to je tak vsetko.

31.10.2010 15:57 mato
Rozbalit Rozbalit vše Re: Bash: Spravny zapis hodnoty premennej
mne netrklo ze "2010-10-31 15:00" je datum a cas :) moja chyba

ja som hore uviedol,ze je mozne pouzit alt. zapis, kde sa potom nestratis v uvodzovkach (alebo aspon nie tak rychlo)
ako si doplnil date --date -> to uz ale meni podstatu toho, co ten script ma robit - preto som sa pytal, ze co chces dosiahnut a povedal, ze cmd "datum 14:00" je blbost .. v spojeni s prepinacom --date je to vsak uz cosi ine

hlavne, ze si to vyriesil :)

31.10.2010 16:51 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: Bash: Spravny zapis hodnoty premennej

Ok, rozumiem. Ale popravde, to o tej blbosti mi pomohlo paradoxne najviac. Som ti chcel dat ten priklad a sa ukazalo, ze mi tam chybalo to --date. Samozrejme uplne vsade. :)

Co sa ale tyka toho alternativneho zapisu, mne nepride az taky prehladny. ;) Ale mozno vec nazoru.

31.10.2010 11:46 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
Rozbalit Rozbalit vše Re: Bash: Spravny zapis hodnoty premennej
Odpovědět | | Sbalit | Link | Blokovat | Admin

Dobry den

Nepomohly by zpetne lomitka ?

SINCE="$DATE \"$($TODAY_CMD) ${1}\" +%s"

Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
31.10.2010 13:18 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: Bash: Spravny zapis hodnoty premennej

Dakujem, to som uz skusal, zial to nepomaha. Samotna hodnota SINCE je sice v spravnom tvare aj uvodzenie je spravne, ale pri jeho vykonani opat nastane rovnaky problem. Vid nizsie:

DATE="$(which date)"

NOW_CMD="$DATE +%s"
TODAY_CMD="$DATE +%F"
TOMORROW_CMD="$DATE -d tomorrow +%F"
# potialto je to v poriadku

# toto uz ale v poriadku nie je
SINCE="$DATE \"$($TODAY_CMD) ${1}\" +%s"
$SINCE

a vysledok:

pato@debian:~$ bash -x ./test.bash 15:00
++ which date
+ DATE=/bin/date
+ NOW_CMD='/bin/date +%s'
+ TODAY_CMD='/bin/date +%F'
+ TOMORROW_CMD='/bin/date -d tomorrow +%F'
++ /bin/date +%F
+ SINCE='/bin/date "2010-10-31 15:00" +%s'
+ /bin/date '"2010-10-31' '15:00"' +%s
/bin/date: extra operand `15:00"'
Try `/bin/date --help' for more information.

Kazdopadne dakuje, sam som to nespomenul predtym.

31.10.2010 14:28 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: Bash: Spravny zapis hodnoty premennej
Odpovědět | | Sbalit | Link | Blokovat | Admin

Vyriesene. Chyba bola trivialna, spravna syntax pre konvert daneho casu je nasledovna:

date --date "cas" +%[moznosti] # z hlavy som to pisal a nejak som pozabudol

Takze riesenie bolo uz v prvom mojom prispevku v poriadku, az na tu malickost:

DATE="$(which date)"

NOW_CMD="$DATE +%s"
TODAY_CMD="$DATE +%F"
TOMORROW_CMD="$DATE -d tomorrow +%F"

for INDEX in {1..9}
do
SINCE="$($DATE --date "$($TODAY_CMD) ${1}:0${INDEX}" +%s)"
sleep 1
done

a vysledok je presne ako som pozadoval, s kazdou jednou iteraciou ziskat aktualny cas:

pato@debian:~$ bash -x ./test.bash 14:00
++ which date
+ DATE=/bin/date
+ NOW_CMD='/bin/date +%s'
+ TODAY_CMD='/bin/date +%F'
+ TOMORROW_CMD='/bin/date -d tomorrow +%F'
+ for INDEX in '{1..9}'
+++ /bin/date +%F
++ /bin/date --date '2010-10-31 14:00:01' +%s
+ SINCE=1288533601
+ sleep 1
+ for INDEX in '{1..9}'
+++ /bin/date +%F
++ /bin/date --date '2010-10-31 14:00:02' +%s
+ SINCE=1288533602
+ sleep 1
+ for INDEX in '{1..9}'
+++ /bin/date +%F
++ /bin/date --date '2010-10-31 14:00:03' +%s
+ SINCE=1288533603
+ sleep 1
+ for INDEX in '{1..9}'
+++ /bin/date +%F
++ /bin/date --date '2010-10-31 14:00:04' +%s
+ SINCE=1288533604
+ sleep 1
+ for INDEX in '{1..9}'
+++ /bin/date +%F
++ /bin/date --date '2010-10-31 14:00:05' +%s
+ SINCE=1288533605
+ sleep 1
+ for INDEX in '{1..9}'
+++ /bin/date +%F
++ /bin/date --date '2010-10-31 14:00:06' +%s
+ SINCE=1288533606
+ sleep 1
+ for INDEX in '{1..9}'
+++ /bin/date +%F
++ /bin/date --date '2010-10-31 14:00:07' +%s
+ SINCE=1288533607
+ sleep 1
+ for INDEX in '{1..9}'
+++ /bin/date +%F
++ /bin/date --date '2010-10-31 14:00:08' +%s
+ SINCE=1288533608
+ sleep 1
+ for INDEX in '{1..9}'
+++ /bin/date +%F
++ /bin/date --date '2010-10-31 14:00:09' +%s
+ SINCE=1288533609
+ sleep 1

Takze uz je to v poriadku. Dakujem vsetkym.

 


            

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.