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

Přihlašte se svým uživatelským jménem a heslem.

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

Peterx

  • Člen
  • **
  • Příspěvků: 400
  • Karma: +7/-3
    • Zobrazit profil
Bash načítanie premennej keď ju potrebujem
« kdy: 30 Říjen 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

  • Člen
  • **
  • Příspěvků: 150
  • Karma: +9/-1
    • Zobrazit profil
Re:Bash načítanie premennej keď ju potrebujem
« Odpověď #1 kdy: 02 Listopad 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

  • Člen
  • **
  • Příspěvků: 400
  • Karma: +7/-3
    • Zobrazit profil
Re:Bash načítanie premennej keď ju potrebujem
« Odpověď #2 kdy: 04 Listopad 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

  • Návštěvník
  • *
  • Příspěvků: 8
  • Karma: +0/-0
    • Zobrazit profil
Re:Bash načítanie premennej keď ju potrebujem
« Odpověď #3 kdy: 05 Listopad 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

  • Člen
  • **
  • Příspěvků: 400
  • Karma: +7/-3
    • Zobrazit profil
Re:Bash načítanie premennej keď ju potrebujem
« Odpověď #4 kdy: 05 Listopad 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

  • Člen
  • **
  • Příspěvků: 150
  • Karma: +9/-1
    • Zobrazit profil
Re:Bash načítanie premennej keď ju potrebujem
« Odpověď #5 kdy: 05 Listopad 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

  • Člen
  • **
  • Příspěvků: 400
  • Karma: +7/-3
    • Zobrazit profil
Re:Bash načítanie premennej keď ju potrebujem
« Odpověď #6 kdy: 05 Listopad 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

  • Člen
  • **
  • Příspěvků: 150
  • Karma: +9/-1
    • Zobrazit profil
Re:Bash načítanie premennej keď ju potrebujem
« Odpověď #7 kdy: 07 Listopad 2019, 10:36:00 »
Prečo to funguje je jednoduché zodpovedať. Nemáš v podmienke "=="