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
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 abash
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 ', akkorecho 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
[[ ! -f /etc/.../... ]]; echo $?
mindegyikhez.[[ -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. Als -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.