Minulla on if
bash-komentosarjassa, jonka on tarkistettava, JOSKIN 2 tiedostoa on olemassa, jos niitä ei ole olemassa, sen pitäisi toistaa.
Minulla on koodi:
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi
Mutta tämä ei ole ” se ei tunnu toimivan jostain syystä.
Olen 110% varma, että näitä kahta tiedostoa ei ole olemassa. En saa virheitä, se ei vain kirjoita if
.
Olen uusi bash-komentosarja, joten en ole varma mitä voisi olla väärä.
Kommentit
Vastaa
Jos haluat joko sitten haluat OR
, ei AND
.
if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi
- Tämä vastaa, jos jompikumpi tai molemmat tiedostot puuttuvat.
- Koodisi tulosta
match
vain, jos molempia ei ole.
Mutta sanoit:
Olen 110% varma, että näitä kahta tiedostoa ei ole olemassa. En saa virheitä, se ei vain kirjoita if-arvoa.
Joten lausuntosi on ristiriidassa itsensä kanssa. Ainakin yksi näistä tiedostoista täytyy olla olemassa, jos olet käynnissä tuo koodi.
Jos haluat nähdä, kuinka if
-lausekkeesi arvioi, suorita se -x
.
#!/bin/bash -x if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi
Sitten näet suorituksen.
$ ./test.sh + [[ ! -f /etc/benchmarking/code ]] + [[ ! -f /etc/benchmarking/code.class ]] + echo match match $
Kommentit
- Haluan sen toistavan " vastaavan " jos kumpaa tiedostoa ei ole, jos sellaista on, sitä ei tulosta. Yritän sitä -x: llä
- Tällöin alkuperäisen koodisi pitäisi olla kunnossa. Ja se todellakin toimii minulle.
Vastaa
Eikö niiden pitäisi olla tällaisia? A on tiedosto tai B on tiedosto ja sitten blabla.
if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]]; then echo "match" fi
Vastaa
Tämä voi toimia myös siinä, mitä yrität tehdä. Yksittäisiä suluita ei yleisesti käytetä tänään bash: n kanssa, mutta tämä on silti vaihtoehto. ”-O”: n käyttö on käytännössä ”OR” -operaatio ja ”!” kumoaa ehdon.
var=/etc/benchmarking/code [ ! -f ${var} -o -f {var}.class ] && echo "match"
Kommentit
- Älä ' t koskaan käytä
[
ryhmässäbash
. Sen lisäksi en ymmärrä, miten tämä vastaa kysymykseen. -
[ ! -f ${var} -a ! -f {var}.class ] && echo "match"
sen pitäisi olla. Tavoitteena oli: jos he (molemmat) eivät ole ' t olemassa, sen pitäisiecho match
.
Vastaus
Koodisi täyttää vaatimukset: se tulostaa match
, jos se ei löydä kumpaakaan tiedostoa .
Siksi match
-syötä ei tulosteta, on muualla. Varmista, että koodilohko on saavutettu, minkä voit tehdä ympäröimällä sen pari virheenkorjausviestiä. Esimerkiksi näin:
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"
Tavanomainen tapa on, että virheenkorjausviestit siirtyvät stderr välttääksesi tietovirran keskeyttämisen stdout : een, mutta olen välttänyt tämän tässä, koska sanoit olevasi aloittelija. Tässä on yksi esimerkki siitä, kuinka voit kirjoittaa stdout :
echo "@ About to enter if...fi block" >&2
[[ ! -f /etc/.../... ]]; echo $?
kullekin.[[ -f xxx ]]
palauttaa arvon true, jos xxx on olemassa ja on tavallinen tiedosto (tai symboli normaaliin tiedostoon). Se palauttaa arvon false, jos se ei ' t on olemassa, tai jos se ' ei voi kertoa, onko sitä olemassa vai ei, tai jos se on olemassa, mutta se ei ole tavallinen tiedosto (hakemisto, putki, laite, liitäntä …) tai jos se ' symboloi tiedostoon, jota ' ei ole, tai se voi ' Kerro onko se olemassa vai ei, vai ei se ole säännöllinen tiedosto …[[ -e $file ]] || [[ -L $file ]]
on lähempänä olemassaolotestiä.ls -d -- "$file" > /dev/null 2>&1
on vielä lähempänä. Ja pääsääntöisesti tällainen testi johtaa kilpailuolosuhteisiin. Ehkä ' on toinen tapa.