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.
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.