Logiskt OCH i ett bash-skript

Jag har en if i mitt bash-skript som måste kontrollera om någon av de två filerna finns, om de inte existerar ska den matcha.

Kod jag har:

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

Men det här gör det inte verkar inte fungera av någon anledning.

Jag är 110% säker på att dessa två filer inte finns. Jag får inte några fel, det går bara inte in i if.

Jag är nybörjare i bash-skript så jag är inte säker på vad som kan vara fel.

Kommentarer

  • Jag tror inte ' tänker att något av svaren som skickas faktiskt tar upp frågan Vad händer när du testar testerna individuellt? Gör [[ ! -f /etc/.../... ]]; echo $? för varje.
  • En varning : [[ -f xxx ]] returnerar true om xxx finns och är en vanlig fil (eller en symlänk till en vanlig fil). Den returnerar falsk om den inte ' t finns, eller om den kan ' t berätta om den finns eller inte eller om den existerar men inte är en vanlig fil (katalog, rör, enhet, uttag …) eller om den ' är en länk till en fil som inte finns ' t eller om den kan ' t berätta om det finns eller inte eller inte är en vanlig fil … [[ -e $file ]] || [[ -L $file ]] är närmare ett test för existens. ls -d -- "$file" > /dev/null 2>&1 är ännu närmare. Och som regel leder denna typ av test till rasförhållanden. Kanske finns det ' ett annat sätt.

Svar

Om du vill ha antingen så vill du OR, inte AND.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 
  • Detta matchar om någon eller båda filerna saknas.
  • Din kod kommer att skriv bara ut match om båda inte finns.

Men , du sa:

Jag är 110% säker på att dessa två filer inte finns. Jag får inga fel, det kommer bara inte in if.

Så ditt uttalande strider mot sig själv. Åtminstone en av filerna måste existera, om du är kör den koden.

Om du vill se hur ditt if uttalande utvärderas, kör det med -x.

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

Då ser du körningen.

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

Kommentarer

  • Jag vill att det ska echo " matcha " om ingen av filerna finns, om någon finns, så matchar den inte. Jag kommer att prova den med -x
  • I så fall skulle din ursprungliga kod vara bra. Och det fungerar verkligen för mig.

Svar

Ska inte det vara så här? A är en fil eller B är en fil, blabla sedan.

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

Svar

Detta kan också fungera för det du försöker göra. Enstaka hakparenteser används inte ofta idag med bash, men det här är fortfarande ett alternativ. Att använda ”-o” är effektivt en ”ELLER” -operation och ”!” upphäver villkoret.

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

Kommentarer

  • Don ' t använder [ i bash. Bortsett från det kan jag inte se hur detta svarar på frågan.
  • [ ! -f ${var} -a ! -f {var}.class ] && echo "match" det borde vara. Uppdraget var: om de (båda) inte ' t existerar ska det echo match.

Svar

Din kod uppfyller dina krav: den kommer att skriva ut match förutsatt att den inte kan hitta någon fil .

Därför finns anledningen till att match inte skrivs ut någon annanstans. Du bör bekräfta att kodblocket nås, vilket du kan göra genom att omge det med en par felsökningsmeddelanden. Till exempel så här:

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" 

Min vanliga inställning är att felsökningsmeddelanden går till stderr för att undvika att avbryta flödet av data till stdout , men jag har undvikit det här eftersom du sa att du var nybörjare. Här är ett exempel som visar hur du kan skriva till stdout :

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *