Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Bash načítanie premennej keď ju potrebujem  (Přečteno 16801 krát)

Peterx

  • Aktivní člen
  • *
  • Příspěvků: 403
Bash načítanie premennej keď ju potrebujem
« kdy: 30 Října 2019, 16:20:44 »
Ahoj,
mám nejaký takýto skript:

Kód: [Vybrat]
premenna1=$(cat subor1)
premenna2=$(cat subor2)     #obsahuje stare data

funkcia1 ()
{
if [ "$premenna1" == "nieco1" ]; then
echo nieco2 > subor2           # zapisu sa nove data
else
echo data nezapisujem
fi;
}

funkcia2 ()
{
if [ "$premenna2" == "nieco2" ]; then
echo cokolvek
else
echo niecoine
fi;
}

funkcia1
funkcia2

Môj problém je že premenná sa načíta pri spustení skriptu, kedy sú ešte v súbore2 staré dáta a tým pádom mi skript skončí.
Je nejaká možnosť aby sa premenná načítavala v momente kedy je použitá? Teda ak ju použijem 5x, tak ju vždy (5x) znovunačíta s aktuálnymi údajmi?

Dík za prípadnú pomoc.

West

  • Aktivní člen
  • *
  • Příspěvků: 404
Re:Bash načítanie premennej keď ju potrebujem
« Odpověď #1 kdy: 02 Listopadu 2019, 14:07:15 »
Súbor2 by teda mal obsahovať nové data? Ak ano, máš overené, že ich aj skutočne obsahuje?
Podľa toho nejakého skriptu sa premenna2 prepisuje datami, tudíž nemôže obsahovať nič iné, len to čo načíta. Ak data čítaš v slučke s periódou niekoľkých milisekúnd až sekúnd data ešte nemusia byť zapísané do súboru, ale môžu trčať v súborovej cache. To by vysvetlovalo prečo načítaš do premennej2 staré data.

Peterx

  • Aktivní člen
  • *
  • Příspěvků: 403
Re:Bash načítanie premennej keď ju potrebujem
« Odpověď #2 kdy: 04 Listopadu 2019, 13:22:02 »
Ahoj,
Nové data tam sú, čakať som skúšal tiež.

Našiel som riešenie také že vo funkcii znova definujem premennú, to funguje, ale nie je to moc pekné.

singularis

  • Aktivní člen
  • *
  • Příspěvků: 176
Re:Bash načítanie premennej keď ju potrebujem
« Odpověď #3 kdy: 05 Listopadu 2019, 07:59:32 »
Řešení je jednoduché: místo proměnné použij další funkci:

Kód: [Vybrat]
premenna1=$(cat subor1)
premenna2 () { cat subor2; }

funkcia1 ()
{
if [ "$premenna1" == "nieco1" ]; then
echo nieco2 > subor2           # zapisu sa nove data
else
echo data nezapisujem
fi;
}

funkcia2 ()
{
if [ "$(premenna2)" == "nieco2" ]; then
echo cokolvek
else
echo niecoine
fi;
}

funkcia1
funkcia2

Obecně, proměnné jsou pouze nositeli konkrétní hodnoty, nemohou odkazovat na soubor či spouštět příkazy (což lze ovšem do určité míry obejít příkazem „eval“, když je potřeba).

Pokud chceš, aby se četlo z původního souboru, i když mezitím změníš aktuální adresář příkazem „cd“, bude definice funkce trochu složitější:

Kód: [Vybrat]
eval "premenna2 () { cat '$(realpath subor2)';}"
A ještě jeden tip: funkce je vlastně určitý druh proměnné, takže další definicí jí můžeš přiřadit nový kód, jako když do proměnné přiřazuješ novou hodnotu.

Peterx

  • Aktivní člen
  • *
  • Příspěvků: 403
Re:Bash načítanie premennej keď ju potrebujem
« Odpověď #4 kdy: 05 Listopadu 2019, 11:48:32 »
Dík, ale toto mi nefunguje.

Kód: [Vybrat]
premenna2 () { cat subor2; } mi nevráti nič

Kód: [Vybrat]
eval "premenna2 () { cat '$(realpath subor2)';}" mi vypíše "Permission denied" aj keď to skúšam priamo z terminálu.
cat subor2 mi však funguje, pozeral som aj práva na súbore, každý má RW práva..

West

  • Aktivní člen
  • *
  • Příspěvků: 404
Re:Bash načítanie premennej keď ju potrebujem
« Odpověď #5 kdy: 05 Listopadu 2019, 13:00:01 »
Bolo by vhodné postnúť kompletný skript a nielen nejakú kostru skriptu. Možno tam máš logickú chybu, ktorú nevidíme. Funkcia dokáže prepísať globálnu premennú ak je v nej uvedené "echo premenna". Zdvojenú rovnosť (==) by som nahradil radšej jednoduchým rovnítkom (=). Podmienky sa niekedy nevykonajú správne ak je tam 2x rovnosť. Je dobré si to otestovať na jednoduchom príklade kde určite vieš aký má byť výsledok.

Peterx

  • Aktivní člen
  • *
  • Příspěvků: 403
Re:Bash načítanie premennej keď ju potrebujem
« Odpověď #6 kdy: 05 Listopadu 2019, 13:58:23 »
Ahoj,

celý skript žial nemôžem tak ako je, ale vždy situáciu testujem na takom jednoduchom ako dávam sem, každopádne odstránim z neho citlivé data a hodím ho sem.
To jedno = vyskúšam, je ale zaujímavé že mi funguje toto:

Kód: [Vybrat]
funkcia1 ()
{
premenna1=$(cat subor1)        #premenna je ciselna hodnota
premenna3=$(cat subor3)        #premenna je ciselna hodnota
if [ "$premenna1" -qt "$premenna3" ]; then
echo nieco2 > subor2           # zapisu sa nove data
else
echo data nezapisujem
fi;
}

Každopádne vidím že sa budem musieť ešte vela učiť :)

West

  • Aktivní člen
  • *
  • Příspěvků: 404
Re:Bash načítanie premennej keď ju potrebujem
« Odpověď #7 kdy: 07 Listopadu 2019, 10:36:00 »
Prečo to funguje je jednoduché zodpovedať. Nemáš v podmienke "=="

Peterx

  • Aktivní člen
  • *
  • Příspěvků: 403
Re:Bash načítanie premennej keď ju potrebujem
« Odpověď #8 kdy: 25 Listopadu 2019, 15:34:40 »
Dík, rozdiel bol naozaj v == a =

 

Provoz zaštiťuje spolek OpenAlt.