Logikus ÉS egy bash szkriptben

Van egy if a bash szkriptemben, amelynek ellenőriznie kell, hogy a 2 fájl létezik, ha nem léteznek, akkor ennek egyeznie kell.

A kódom van:

if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 

De ez nem történik meg úgy tűnik, valamiért nem működik.

110% -ban biztos vagyok benne, hogy ez a 2 fájl nem létezik. Nem kapok hibát, csak nem adom meg a if fájlt.

Új vagyok a bash szkriptek terén, így nem vagyok biztos benne, mi lehet helytelen.

Megjegyzések

  • Nem gondolom, hogy a kiküldött válaszok egyike valóban a kérdést illeti Mi történik, ha egyenként próbálja ki a teszteket? Tegye [[ ! -f /etc/.../... ]]; echo $? mindegyikhez.
  • Figyelmeztetés : [[ -f xxx ]] true értéket ad vissza, ha az xxx létezik , és egy normál fájl (vagy egy szimbolikus link egy rendes fájlhoz). Hamis értéket ad vissza, ha nem ' t létezik, vagy ha ' nem tudja megmondani, hogy létezik-e vagy sem, vagy létezik, de nem szabályos fájl (könyvtár, cső, eszköz, socket …) vagy ha ' szimbolikusan kapcsolódik egy olyan fájlhoz, amely nem létezik ', vagy ' t megmondani, hogy létezik-e vagy sem, vagy nem szabályos fájl … [[ -e $file ]] || [[ -L $file ]] közelebb áll a létezés tesztjéhez. A ls -d -- "$file" > /dev/null 2>&1 még közelebb van. És általában ez a fajta teszt versenykörülményekhez vezet. Talán ' más módja van.

Válasz

Ha -t akarja akár , akkor OR -t akarja, nem pedig AND.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 
  • Ez megegyezik, ha egyik vagy mindkét fájl hiányzik.
  • A kódod csak akkor nyomtassa ki a match -t, ha mindkettő nem létezik.

De , Ön azt mondta:

110% -ig biztos vagyok benne, hogy ez a 2 fájl nem létezik. Nincs hibám, csak nem írja be az if-t.

Tehát állítása ellentmond önmagának. Ezen fájlok közül legalább egynek léteznie kell, iv kell = ha vagy futtatja ezt a kódot.

Ha meg szeretné tudni, hogyan értékeli a if utasítás, futtassa a következővel: -x.

#!/bin/bash -x if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 

Ekkor látni fogja a végrehajtást.

$ ./test.sh + [[ ! -f /etc/benchmarking/code ]] + [[ ! -f /etc/benchmarking/code.class ]] + echo match match $ 

Megjegyzések

  • Azt akarom, hogy visszhangozzon " egyezzen " egyik fájl sem létezik, ha létezik, akkor nem egyezik. Megpróbálom az -x használatával
  • Ebben az esetben az eredeti kódjának rendben kell lennie. És valóban működik nekem.

Válasz

Nem ilyenek lennének? A fájl vagy B fájl, majd blabla.

if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]]; then echo "match" fi 

Válasz

Ez arra is alkalmas lehet, amit próbál. Egyetlen zárójelet ma nem használnak a bash-nál, de ez még mindig opció. Az “-o” használata gyakorlatilag egy “VAGY” művelet, és a “!” tagadja a feltételt.

var=/etc/benchmarking/code [ ! -f ${var} -o -f {var}.class ] && echo "match" 

Megjegyzések

  • Don ' t mindig használja a [ elemet a bash mezőben. Ettől eltekintve nem látom, hogy ez hogyan válaszolja meg a kérdést.
  • [ ! -f ${var} -a ! -f {var}.class ] && echo "match" annak kell lennie. A küldetés a következő volt: ha (mindkettő) nem létezik ', akkor echo match.

Válasz

A kód megfelel az Ön követelményeinek: ki fogja nyomtatni match, feltéve, hogy egyik fájlt sem találja meg .

Ezért a match nem nyomtatásának oka máshol van. Meg kell erősítenie, hogy elérte a kódblokkot, amit megtehet, ha egy pár hibakereső üzenet. Például így:

echo "@ About to enter if...fi block" if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi echo "@ Finished if...fi block" 

A szokásos beállításom, hogy az üzenetek hibakeresését a stderr annak érdekében, hogy elkerüljék az adatfolyam megszakítását a stdout ig, de ezt itt elkerültem, mert kezdőnek mondtad. Itt van egy példa arra, hogyan írhatsz a stdout :

echo "@ About to enter if...fi block" >&2 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük