Looginen JA bash-komentosarjassa

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

  • En ' usko, että mikään lähetetyistä vastauksista vastaa kysymykseen Mitä tapahtuu, kun kokeilet testejä erikseen? Tee [[ ! -f /etc/.../... ]]; echo $? kullekin.
  • Varoitus : [[ -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.

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äisi echo 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 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *