Kezdőoldal » Számítástechnika » Programozás » Bash script, elágazás (if)...

2*Sü kérdése:

Bash script, elágazás (if) probléma, következetlen viselkedés. Mi a gond?

Figyelt kérdés

Adott a következő rendszer:


Ha egy bizonyos mappa valamelyik almappájában bármelyik fájl megváltozik, akkor el kell végezni valamilyen műveletet:

- Ha a megváltozott fájl a "common" nevű almappában van, akkor le kell futtatni az "egyik.sh" scriptet.

- Ha a megváltozott fájl nem a "common" nevű almappában van, akkor le kell futtatni a "masik.sh" scriptet, átadva neki a megváltozott fájl szülőmappájának nevét.


A fájl változást figyeli egy inotify-ra épített progi, azzal így önmagában úgy tűnik nincs is gond. Ha megváltozik a fájl, akkor meghívja a következőt:

/automatizalas/automation.sh change %f

Ahol %f a megváltozott fájl neve a teljes útvonallal.


Az automation.sh tartalmának lényegi része:


#!/bin/bash

# …

LOGFILE=/automatizalas/naplo.log

echo "----- Automatizálás script indul -----" >> ${LOGFILE}

echo "A következő fájl megváltozott:" >> ${LOGFILE}

echo $2 >> ${LOGFILE}

DIR=`dirname $2`

SHORTDIR=`basename $`

echo "A SHORTDIR értéke felkiáltójelek között:" >> ${LOGFILE}

echo !${SHORTDIR}! >> ${LOGFILE}

if [ "${SHORTDIR}" == "common" ]

then

echo "Ez a common mappa." >> ${LOGFILE}

egyik.sh

else

echo "Ez NEM a common mappa." >> ${LOGFILE}

masik.sh ${SHORTDIR}

fi

echo "----- Automatizálás script vége -----" >> ${LOGFILE}

#…


1. Törlöm a logfájl teljes tartalmát.

2. Megváltoztatom a /utvonal/a/figyelt/mappahoz/common/valtozik.txt fájlt. (Nyilván egyszer lefut a script.)

3. Beírom a terminálba, hogy:

/automatizalas/automation.sh change /utvonal/a/figyelt/mappahoz/common/valtozik.txt


A logfájl (/automatizalas/naplo.log) tartalma:


----- Automatizálás script indul -----

A következő fájl megváltozott:

/utvonal/a/figyelt/mappahoz/common/valtozik.txt

A SHORTDIR értéke felkiáltójelek között:

!common!

Ez NEM a common mappa.

----- Automatizálás script vége -----

----- Automatizálás script indul -----

A következő fájl megváltozott:

/utvonal/a/figyelt/mappahoz/common/valtozik.txt

A SHORTDIR értéke felkiáltójelek között:

!common!

Ez a common mappa.

----- Automatizálás script vége -----


~ ~ ~ ~ ~ ~ ~


És itt a furcsaság:

1. Ha az inotify váltja ki a script futását, akkor a $2 paraméter az, ami. A változó kiírása felkiáltójelek között is az, ami, viszont nem várt módon az összehasonlításnál (if) az else ágra lép.

2. Ha ugyanezt terminálból hívom meg, ugyanazokkal a paraméterekkel, akkor is ugyanaz a $2 paraméter, ugyanazt írja a logban, hogy !common!, viszont így elvárt módon az then ágba lép az összehasonlításnál.


~ ~ ~ ~ ~ ~ ~


A kérdés: Mi a pék?

Hosszabban: Ha ugyanazok a script bemeneti paraméterei, a log alapján is úgy tűnik ugyanaz a vizsgált változó értéke, ami nem kézzel lett beadva, hanem egy létező fájl teljes útvonalából lett kiollózva, így még félreírás sem lehet – és megnézve hex editorral, nincs ott semmi rejtett karakter –, akkor miért fut az egyik esetben az elágazás az else ágra, és miért fut terminálból meghívva az then ágra? Mit nem értek?


~ ~ ~ ~ ~ ~ ~


Megjegyzések:

1. Nem, nincs még egy eldugott példány más mappában az automation.sh-ból, valóban ugyanazt a scriptet hívta meg az inotify is, meg én is a terminálból.

2. Az útvonalban nincsenek speciális karakterek – de még nagybetű, vagy szám sem –, a teljes útvonal minden könyvtárának, fájljának neve [a-z.]*

3. Igen, kell az első paraméter, a script kissé összetettebb, az első paraméter alapján elágazik, amit nem másoltam be. Viszont az idézett kódrészlet az, ami. Nincsenek közbenső, kihagyott sorok, amik esetleg megváltoztathatnák a vizsgált változó értékét. Nincs más ágban sem hasonló kódrészlet, tehát biztos ugyanarról az elágazásról beszélünk.



2018. dec. 5. 16:24
 1/7 A kérdező kommentje:

Hmm…


Javítás:

SHORTDIR=`basename ${DIR}`

2018. dec. 5. 16:27
 2/7 A kérdező kommentje:

Ha valakinek így szebb:

pastebin (pont) com (per) 9G1TinsQ

2018. dec. 5. 16:29
 3/7 anonim ***** válasza:
84%
Dupla egyenloseg helyett csak sima egyenloseg kell az if-ben.
2018. dec. 5. 17:16
Hasznos számodra ez a válasz?
 4/7 A kérdező kommentje:

Aham! Köszi!


(Közben megoldottam máshogy, bizonyos szempontból számomra rugalmasabb módon, de akkor ezt megjegyeztünk. Bár akkor is érdekes a kérdés, hogy miért fut következetesen az egyik meghívási mód az then, a másik az else ágra, mert ha ez a == egy bug, akkor valahol azt várná az ember, hogy következetesen csinálja ugyanazt a nem várt működést.)

2018. dec. 5. 18:05
 5/7 anonim ***** válasza:
0%

#3

if-ben dupla legyenlőség kell. Simát csak akkor használunk, ha a egy változót deklarálunk benne és dolgozni szeretnénk még benne.


if(1 == 1) //igaz lesz a feltétel

if($bool = (1 == 1)) //eltesszük az eredményt {1 vagy true}


Hülyeséget légyszives ne írj a kérdezőnek.

2018. dec. 6. 00:20
Hasznos számodra ez a válasz?
 6/7 anonim ***** válasza:

Kiegészítésként:

[link]

2018. dec. 6. 00:51
Hasznos számodra ez a válasz?
 7/7 A kérdező kommentje:

#5: Nem PHP-ről, sem nem Javascriptről van szó, hanem bash scriptről. Bash script esetén amit írsz, az ezer sebből vérzik.


#6: Köszi.

2018. dec. 8. 11:15

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!