Bir bash komut dosyasında mantıksal VE


10

Ben if2 dosya EITHER olup olmadığını kontrol etmek zorunda benim bash komut dosyası var, yoksa onlar yankı eşleşmelidir.

Kod var:

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

Ama bu bir sebepten dolayı işe yaramıyor gibi görünüyor.

Bu 2 dosyanın olmadığından% 110 eminim. Herhangi bir hata almıyorum, sadece girmiyor if.

Komut dosyası yazma konusunda yeniyim, bu yüzden neyin yanlış olabileceğinden emin değilim.


Gönderilen cevapların hiçbirinin soruyu ele aldığını düşünmüyorum. Testleri ayrı ayrı denediğinizde ne olur? Do [[ ! -f /etc/.../... ]]; echo $?her biri için.
jw013 13:12

Uyarı : [[ -f xxx ]]xxx varsa ve normal bir dosyaysa (veya normal bir dosyaya bir sembolik bağlantı) true değerini döndürür . Varsa veya var olup olmadığını veya var olup olmadığını söyleyemiyorsa, normal bir dosya (dizin, boru, aygıt, soket ...) veya bir symlink olup olmadığını yanlış döndürür. var olmayan veya normal bir dosya olup olmadığını söyleyemeyen bir dosyaya ... [[ -e $file ]] || [[ -L $file ]]varoluş testine daha yakındır. ls -d -- "$file" > /dev/null 2>&1daha da yakın. Ve kural olarak, bu tür testler yarış koşullarına yol açar. Belki başka bir yol var.
Stéphane Chazelas

Yanıtlar:


12

İsterseniz ya ardından istediğiniz ORdeğil AND.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
  • Dosyalardan biri veya her ikisi de eksikse bu eşleşecektir.
  • Kodunuz yalnızca her ikisi de mevcut matchdeğilse yazdırılır .

Ama dedin ki:

Bu 2 dosyanın olmadığından% 110 eminim. Herhangi bir hata almıyorum, sadece if girmiyor.

Yani ifadeniz kendisiyle çelişiyor. Bu dosyaların en az biri olmalı , mevcut eğer Çalıştırdığınız o kodu.

İfadenizin nasıl ifdeğerlendirildiğini görmek istiyorsanız , ile çalıştırın -x.

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

Sonra idam göreceksiniz.

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

Ben hiçbir dosya varsa, "eşleşme" yankı istiyorum, biri varsa bu eşleşme yazdırmaz.
-X

Bu durumda orijinal kodunuz iyi olmalıdır. Ve gerçekten benim için çalışıyor.
Bahama

3

Bu böyle olmamalı mı? A bir dosya veya B bir dosya, sonra blabla.

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

3

Bu, yapmaya çalıştığınız şey için de işe yarayabilir. Tek parantezler bugün bash ile yaygın olarak kullanılmamaktadır, ancak bu hala bir seçenektir. '-O' kullanmak etkin olarak bir "VEYA" işlemidir ve "!" durumu reddeder.

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

Hiç kullanmayın [içinde bash. Bunun dışında, bunun soruyu nasıl cevapladığını göremiyorum.
jw013 13:12

[ ! -f ${var} -a ! -f {var}.class ] && echo "match"olmalı. Görev şöyleydi: eğer ikisi de yoksa, olmalıdır echo match.
hschou

0

Kodunuz gereksinimlerinizi karşılar: matchher iki dosyayı da bulamadığı sürece yazdırılır .

Bu nedenle matchyazdırılmamasının nedeni başka yerlerde. Kod bloğuna ulaşıldığını doğrulamalısınız; bu, birkaç hata ayıklama iletisiyle çevreleyerek yapabilirsiniz. Örneğin, şöyle:

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'

Her zamanki tercihim, veri akışının stdout'a kesilmesini önlemek için hata ayıklama mesajlarının stderr'a gitmesidir , ancak bundan kaçındım çünkü yeni başlayan olduğunuzu söylediniz. İşte stdout'a nasıl yazabileceğinizi gösteren bir örnek :

echo '@ About to enter if...fi block' >&2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.