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
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
[
vbash
. 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 byecho 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
[[ ! -f /etc/.../... ]]; echo $?
pro každý.[[ -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.