Skip to content

Jak používat testovací podmínky v bash skriptu

2 de Srpen de 2021
Screenshotfrom2019 02 1510 34 12 5c672dc346e0fb0001210aa9

Linux test příkaz porovnává jeden prvek s druhým, ale častěji se používá ve skriptech prostředí BASH jako součást podmíněných příkazů, které řídí logiku a tok programu.

Základní příklad

Zkuste tyto příkazy v okně terminálu. test 1 -ekv. 2 && echo „ano“ || ozvěna „ne“

Výše uvedený příkaz se rozpadá následovně:

  • test: Příkaz k provedení srovnání
  • 1: První prvek, který budete porovnávat. V tomto případě je to číslo 1 ale může to být libovolné číslo nebo řetězec v uvozovkách.
  • ekv: Metoda srovnání. V tomto případě testujete, zda se jedna hodnota rovná druhé.
  • 2: Prvek, se kterým porovnáváte první prvek. V tomto případě je to číslo 2.
  • &&: Linuxová zkratka pro řetězení příkazů dohromady, v pořadí. Výstup z testovacích řetězců k příkazům, které následují. Dvojitý ampersand se spustí, když příkaz, který mu předchází, má stav ukončení 0, což je fantastický způsob, jak říci, že příkaz neselhal.
  • ozvěna „ano“: Příkaz ke spuštění, pokud je srovnání úspěšné. V tomto případě vše, co děláme, je ptát se echo příkaz k vytištění slova „ano“ na standardní výstup, ale můžete zde spustit jakýkoli příkaz, který by se provedl, pokud by se výsledek testu ukázal jako pravdivý.
  • ||: Svým způsobem opak &&; dvojité potrubí se spustí pouze v případě, že příkaz, který mu předchází, selže (má stav ukončení, který není 0).
  • ozvěna „ne“: Příkaz ke spuštění, pokud selže srovnání.

Spustit z příkazového řádku, test nevrací hodnotu na standardní výstup, pouze vrací kód stavu ukončení. Proto je nutné řetězení příkazu echo.

stav ukončení testu

Příkaz v podstatě porovnává 1 až 2 a pokud se shodují, provede se příkaz echo „ano“, který zobrazí „ano“, a pokud se neshodují, provede se příkaz echo „ne“, který zobrazí „ne“.

Porovnávání čísel

Pokud porovnáváte prvky analyzované jako čísla, můžete použít následující operátory porovnání:

  • -ekv: hodnota 1 se rovná hodnotě 2
  • -ge: hodnota 1 větší nebo rovná hodnotě 2
  • -gt: hodnota 1 větší než hodnota 2
  • -le: hodnota 1 menší nebo rovna hodnotě 2
  • -lt: hodnota 1 menší než hodnota 2
  • -ne: hodnota 1 se nerovná hodnotě 2

Ukázkové testy

test 1 -ekv. 2 && echo „ano“ || ozvěna „ne“

(na obrazovce se zobrazí „ne“, protože 1 se nerovná 2) test 1 -ge 2 && echo „yes“ || ozvěna „ne“

(na obrazovce se zobrazí „ne“, protože 1 není větší nebo rovno 2) test 1 -gt 2 && echo „ano“ || ozvěna „ne“

(na obrazovce se zobrazí „ne“, protože 1 není větší než 2) test 1 -le 2 && echo „ano“ || ozvěna „ne“

(na obrazovce se zobrazí „ano“, protože 1 je menší nebo rovno 2) test 1 -lt 2 && echo „ano“ || ozvěna „ne“

(na obrazovce se zobrazí „ano“, protože 1 je menší nebo rovno 2) test 1 -ne 2 && echo „ano“ || ozvěna „ne“

(na obrazovce se zobrazí „ano“, protože 1 se nerovná 2)

Porovnání textu

Když porovnáváte prvky analyzované jako řetězce, použijte následující operátory porovnání:

  • =: řetězec 1 odpovídá řetězci 2
  • ! =: řetězec 1 neodpovídá řetězci 2
  • -n: délka řetězce je větší než 0
  • -z: délka řetězce se rovná 0

Příklady

test „string1“ = „string2“ && echo „yes“ || ozvěna „ne“

(na obrazovce se zobrazí „ne“, protože „řetězec1“ se nerovná „řetězci2“) otestujte „řetězec1“! = „řetězec2“ && echo „ano“ || ozvěna „ne“

(na obrazovce se zobrazí „ano“, protože „string1“ se nerovná „string2“) test -n „string1“ && echo „yes“ || ozvěna „ne“

(na obrazovce se zobrazí „ano“, protože „řetězec1“ má délku řetězce větší než nula) test -z „řetězec1“ && echo „ano“ || ozvěna „ne“

(na obrazovce se zobrazí „ne“, protože „řetězec1“ má délku řetězce větší než nula)

Porovnávání souborů

Při porovnávání souborů použijte následující operátory porovnání:

  • -ef: Soubory mají stejné zařízení a čísla inodů (jsou to stejný soubor)
  • -ne: První soubor je novější než druhý soubor
  • -ot: První soubor je starší než druhý soubor
  • -b: Soubor existuje a je speciální blok
  • -C: Soubor existuje a je speciální postava
  • -d: Soubor existuje a je adresářem
  • -E: Soubor existuje
  • -F: Soubor existuje a je to běžný soubor
  • -G: Soubor existuje a má zadané číslo skupiny
  • -G: Soubor existuje a je vlastníkem skupiny uživatelů
  • -h nebo -L: Soubor existuje a je symbolickým odkazem
  • -k: Soubor existuje a má nastavený lepivý bit
  • : Soubor existuje, jste vlastníkem
  • -p: Soubor existuje a je pojmenovaný kanál
  • -r: Soubor existuje a je čitelný
  • -s: Soubor existuje a má velikost větší než nula
  • -S: Soubor existuje a je soketem
  • -t: Popisovač souboru je otevřen na terminálu
  • -u: Soubor existuje a je nastaven bit set-user-id
  • -w: Soubor existuje a je zapisovatelný
  • -X: Soubor existuje a je spustitelný

Příklady

test/cesta/do/soubor1 -nt/cesta/do/soubor2 && echo „ano“

(Pokud je soubor1 novější než soubor2, zobrazí se slovo „ano“) test -e/cesta/k/soubor1 && echo „ano“

(pokud soubor1 existuje, zobrazí se slovo „ano“) test -O/cesta/k/soubor1 && echo „ano“

(pokud vlastníte soubor1, zobrazí se slovo „ano“)

Blokový speciál: Soubor je blokové zařízení, což znamená, že data jsou čtena v blocích bajtů. Obvykle se jedná o soubory zařízení, jako jsou pevné disky.
Zvláštní postava: Soubor je zpracován okamžitě, když do něj zapisujete, a je obvykle zařízením, jako je sériový port

Porovnání více podmínek

Až dosud vše porovnávalo jednu věc s druhou, ale co když chcete porovnat dvě podmínky? Pokud má například zvíře čtyři nohy a jde „moo“, je to pravděpodobně kráva. Pouhá kontrola čtyř nohou nezaručuje, že máte krávu, ale kontrola zvuku, který vydává, určitě ano. Chcete -li otestovat obě podmínky najednou, použijte následující příkaz: test 4 -eq 4 -a „moo“ = „moo „&& echo“ to je kráva “|| ozvěna „to není kráva“

Klíčovou součástí je zde -A vlajka, což znamená a. Existuje lepší a běžněji používaný způsob provádění stejného testu, a to následovně: test 4 -ekv. 4 && test „moo“ = „moo“ && echo „to je kráva“ || ozvěna „to není kráva“

Sledujte větve!

Rozvětvení test příkaz je důležitý. Pokud první test (4 = 4) selže, test příkaz končí nenulovým ukončovacím kódem. Přeskočíme tedy na symbol dvojité trubky a „to není kráva“ se vytiskne na standardní výstup. Pokud je však první test úspěšný a tím test výsledkem je výstupní kód 0, pak skočíme na první dvojitý ampersand. Toto další tvrzení je další testovací podmínkou! Pokud druhý test selže, znovu skočíme na dvojtrubku a odtud pokračujeme. Pokud je však druhý test úspěšný, přeskočíme na druhý příkaz s dvojitým ampersandem, který v tomto příkladu pouze odráží „to je kráva“ na standardní výstup a poté skončí zpět na výzvu shellu. Další test porovnává dva příkazy a pokud je kterýkoli z nich pravdivý, vygeneruje řetězec. Chcete -li například zkontrolovat, zda existuje soubor s názvem „file1.txt“ nebo soubor s názvem „file1.doc“, můžete použít následující příkaz: test -e file1.txt -o -e file1.doc && echo „file1 existuje „|| echo „soubor1 neexistuje“

Klíčovou součástí je zde což znamená nebo. Existuje lepší a běžněji používaný způsob provádění stejného testu, a to následovně: test -e file1.txt || test -e soubor1.doc && echo „soubor1 existuje“ || echo „soubor1 neexistuje“

Odstranění testovacího klíčového slova

Slovo ve skutečnosti používat nemusíte test provést srovnání. Jediné, co musíte udělat, je uzavřít prohlášení do hranatých závorek takto:

[ -e file1.txt ] && echo „soubor1 existuje“ || echo „soubor1 neexistuje“

The [ and ] v zásadě znamená totéž jako test. Nyní víte, že to můžete zlepšit porovnáním více podmínek následujícím způsobem:

[ 4 -eq 4 ] && [ „moo“ = „moo“ ] && echo „to je kráva“ || ozvěna „to není kráva“

[ -e file1.txt ] || [ -e file1.doc ] && echo „soubor1 existuje“ || echo „soubor1 neexistuje“

souhrn

Příkaz test je užitečnější ve skriptech, protože můžete testovat hodnotu jedné proměnné proti druhé a řídit tok programu. Pomocí příkazového řádku otestujte, zda soubor existuje nebo ne.