Logické AND v bash skriptu

Mám if v mém bash skriptu, který musí zkontrolovat, zda JE tyto 2 soubory existují, pokud neexistují, mělo by se shodovat s ozvěnou.

Mám kód:

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

Ale to není možné “ Zdá se, že z nějakého důvodu nefunguje.

Jsem si 110% jistý, že tyto 2 soubory neexistují. Nedostávám žádné chyby, prostě nezadávám if.

Jsem nový v bash skriptování, takže si nejsem jistý, co by mohlo být špatně.

Komentáře

  • Nemyslím si ' že žádná ze zveřejněných odpovědí se touto otázkou ve skutečnosti nezabývá . Co se stane, když vyzkoušíte testy jednotlivě? Udělejte [[ ! -f /etc/.../... ]]; echo $? pro každý.
  • Varování : [[ -f xxx ]] vrací true, pokud xxx existuje a je běžný soubor (nebo symbolický odkaz na běžný soubor). Vrátí false, pokud to ' neexistuje, nebo pokud ' nezjistí, zda existuje nebo neexistuje, nebo zda existuje, ale nejde o běžný soubor (adresář, kanál, zařízení, zásuvka …) nebo pokud ' sa odkazuje na soubor, který neexistuje ' nebo nemůže ' Nezjistit, zda existuje, nebo neexistuje běžný soubor … [[ -e $file ]] || [[ -L $file ]] je blíže testu existence. ls -d -- "$file" > /dev/null 2>&1 je ještě blíž. A tento test zpravidla vede k rasovým podmínkám. Možná je ' jiný způsob.

Odpověď

Pokud chcete buď pak chcete OR, ne AND.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 
  • Toto bude odpovídat, pokud chybí jeden nebo oba soubory.
  • Váš kód bude tiskněte match, pokud oboje neexistují.

Ale , řekli jste:

Jsem si 110% jistý, že tyto 2 soubory neexistují. Nedostávám žádné chyby, pouze nezadávám if.

Vaše prohlášení si tedy odporuje. Alespoň jeden z těchto souborů musí existovat, pokud jste spuštěn ten kód.

Pokud chcete vidět, jak se váš if vyhodnocuje, spusťte jej s -x.

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

Pak uvidíte provedení.

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

Komentáře

  • Chci, aby to echo " odpovídalo " pokud žádný soubor neexistuje, pokud existuje, nevytiskne shodu. Zkusím to s -x
  • V takovém případě by měl být váš původní kód v pořádku. A opravdu to pro mě funguje.

Odpověď

Nemělo by to tak být? A je soubor nebo B je soubor, pak blabla.

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

Odpovědět

To může také fungovat pro to, co se snažíte dělat. Jednotlivé závorky se dnes v bash běžně nepoužívají, ale stále je to možnost. Použití „-o“ je ve skutečnosti operace „NEBO“ a „!“ neguje podmínku.

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

Komentáře

  • Don ' nikdy nepoužije [ v bash. Kromě toho nechápu, jak to odpovídá na otázku.
  • [ ! -f ${var} -a ! -f {var}.class ] && echo "match" to by mělo být. Úkol zněl: pokud (oba) neexistují ', měl by echo match.

Odpověď

Váš kód splňuje vaše požadavky: vytiskne match za předpokladu, že nemůže najít žádný soubor .

Proto se důvod match nevytiskne jinde. Měli byste potvrdit, že bylo dosaženo bloku kódu, což můžete udělat tak, že jej obklopíte znakem několik ladicích zpráv. Například takto:

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" 

Moje obvyklá preference je, že ladicí zprávy přejdou na stderr aby nedošlo k přerušení toku dat do stdout , ale tomu jsem se zde vyhnul, protože jste řekl, že jste začátečník. Zde je jeden příklad, který ukazuje, jak můžete psát do stdout :

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *