Logic ȘI într-un script bash

Am un if în scriptul bash care trebuie să verifice dacă ORICE din cele 2 fișiere există, dacă nu există, ar trebui să se potrivească.

Codul pe care îl am:

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

Dar acest lucru nu înseamnă ” Se pare că nu funcționează dintr-un anumit motiv.

Sunt 110% sigur că aceste 2 fișiere nu există. Nu primesc nicio eroare, pur și simplu nu intră în if.

Sunt nou în scripturile bash, deci nu sunt sigur ce ar putea fi greșit.

Comentarii

  • Nu cred că ' nu cred că vreunul dintre răspunsurile postate abordează de fapt întrebarea . Ce se întâmplă când încercați testele individual? Faceți [[ ! -f /etc/.../... ]]; echo $? pentru fiecare.
  • Un avertisment : [[ -f xxx ]] returnează adevărat dacă există xxx și este un fișier obișnuit (sau un link simbolic către un fișier obișnuit). Acesta va reveni fals dacă nu ' nu există sau dacă nu poate ' să spună dacă există sau nu sau dacă există, dar nu este un fișier obișnuit (director, conductă, dispozitiv, soclu …) sau dacă ' este un link simbolic către un fișier care nu ' nu există sau poate ' Spuneți dacă există sau nu sau nu este un fișier obișnuit … [[ -e $file ]] || [[ -L $file ]] este mai aproape de un test de existență. ls -d -- "$file" > /dev/null 2>&1 este și mai aproape. Și, de regulă, acest tip de test duce la condiții de cursă. Poate că există ' în alt mod.

Răspunde

Dacă doriți fie apoi doriți OR, nu AND.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 
  • Acest lucru se va potrivi dacă lipsesc oricare sau ambele fișiere.
  • Codul dvs. va fi tipăriți match numai dacă ambele nu există.

Dar , ați spus:

Sunt 110% sigur că aceste 2 fișiere nu există. Nu primesc nicio eroare, doar nu „introduce” if.

Declarația dvs. se contrazice însăși. Cel puțin unul dintre aceste fișiere trebuie să existe, dacă sunteți rulează codul acel .

Dacă doriți să vedeți cum evaluează instrucțiunea dvs. if, rulați-o cu -x.

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

Apoi veți vedea execuția.

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

Comentarii

  • Vreau ca acesta să fie ecou " se potrivește cu " dacă niciun fișier nu există, dacă există unul, nu se potrivește. Îl voi încerca cu -x
  • În acest caz, codul original ar trebui să fie bine. Și într-adevăr funcționează pentru mine.

Răspuns

Nu ar trebui să fie așa? A este un fișier sau B este un fișier, apoi blabla.

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

Răspuns

Acest lucru poate funcționa și pentru ceea ce încercați să faceți. Parantezele simple nu sunt utilizate în mod obișnuit astăzi cu bash, dar aceasta este încă o opțiune. Folosirea „-o” este efectiv o operațiune „SAU” și „!” neagă condiția.

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

Comentarii

  • Nu ' t folosiți vreodată [ în bash. În afară de asta, nu reușesc să văd cum răspunde acest lucru la întrebare.
  • [ ! -f ${var} -a ! -f {var}.class ] && echo "match" ar trebui să fie. Căutarea a fost: dacă ei (ambii) nu ' nu există, ar trebui să echo match.

Răspuns

Codul dvs. îndeplinește cerințele dvs.: va imprima match cu condiția să nu poată găsi niciun fișier .

Prin urmare, motivul pentru care match nu este tipărit se află în altă parte. Ar trebui să confirmați că blocul de cod este atins, lucru pe care îl puteți face înconjurându-l cu un câteva mesaje de depanare. De exemplu, așa:

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" 

Preferința mea obișnuită este ca mesajele de depanare să meargă la stderr pentru a evita întreruperea fluxului de date la stdout , dar am evitat asta pentru că ați spus că sunteți începător. Iată un exemplu care arată cum ați putea scrie la stdout :

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *