Co znamenají hranaté závorky bez “ pokud ” vlevo? [duplicate]

Tato otázka již má odpovědi zde :

Komentáře

  • Nejedná se o duplikát. Druhá otázka se týká otázky if. Tato otázka se ptá, co závorky znamenají bez prohlášení if.

Odpovědět

Hranaté závorky jsou zkratkovou notací pro provedení podmíněného testu. Závorky [ a [[ jsou skutečné příkazy v Unixu, věřte tomu nebo ne.

Mysli:

$ [ -f /etc/rc.local ] && echo "real file" real file -and- $ test -f /etc/rc.local && echo "real file" real file 

V Bash je [ vestavěný příkaz i spustitelný soubor. [[ je pouze klíčové slovo pro Bash.

Příklad

Toto můžete potvrdit pomocí type:

$ type -a [ [ is a shell builtin [ is /usr/bin/[ $ type -a [[ [[ is a shell keyword 

Fyzický spustitelný soubor naleznete zde:

$ ls -l /usr/bin/[ -rwxr-xr-x 1 root root 37000 Nov 3 2010 /usr/bin/[ 

builtins vs . keywords

Pokud se podíváte na manuálovou stránku Bash, man bash, najdete pro ni následující definice:

  • klíčová slova – Vyhrazená slova jsou slova, která mají pro shell zvláštní význam. Následující slova jsou rozpoznáno jako rezervované, když je necitováno, a to buď první slovo jednoduchého příkazu (viz SHELL GRAMMAR níže), nebo třetí slovo případu nebo pro příkaz:

    ! case do done elif else esac fi for function if in select then until while { } time [[ ]] 
  • builtins – Pokud název příkazu neobsahuje žádná lomítka, prostředí se jej pokusí vyhledat. Pokud existuje existuje shell funkce s tímto názvem, tato funkce je vyvolána, jak je popsáno výše v F. UNCTION. Pokud název neodpovídá funkci, prostředí ji vyhledá v seznamu integrovaných prostředí. Pokud je nalezena shoda, je vyvolána předdefinovaná hodnota.

    Pokud název není ani funkcí shellu, ani předdefinovanou hodnotou a neobsahuje lomítka, bash prohledá každý prvek PATH adresáře obsahujícího spustitelný soubor podle to jméno. Bash používá hashovací tabulku k zapamatování úplných názvů spustitelných souborů (viz hash v části SHELL BUILTIN COMMANDS níže). Úplné prohledání adresářů v PATH se provede pouze v případě, že příkaz není nalezen v hash tabulce. Pokud je vyhledávání neúspěšné, shell vyhledá definovanou funkci shellu s názvem command_not_found_handle. Pokud tato funkce existuje, je vyvolána s původním příkazem a argumenty původního příkazu jako argumenty a stav ukončení funkce se stane stavem ukončení prostředí. Pokud tato funkce není definována, shell vytiskne chybovou zprávu a vrátí stav ukončení 127.

manuálová stránka

Pokud se podíváte skrz Bash manuálovou stránku najdete na ní podrobnosti.

test expr [ expr ] Return a status of 0 or 1 depending on the evaluation of the conditional expression expr. Each operator and operand must be a separate argument. Expressions are composed of the primaries described above under CONDITIONAL EXPRESSIONS. test does not accept any options, nor does it accept and ignore an argument of -- as signifying the end of options. 

Nakonec z manuálové stránky:

 test and [ evaluate conditional expressions using a set of rules based on the number of arguments. 

EDIT # 1

Následná otázka z OP.

Dobře, tak proč existuje potřebujete tedy „pokud“? Chci říct, proč „pokud“ vůbec existuje, pokud by „[“ stačilo.

if je součástí podmíněného. Příkaz test nebo [ ... ] jednoduše vyhodnotí podmíněné a vrátí 0 nebo a 1. Na 0 nebo 1 se poté použije příkaz if. 2 při jejich použití spolupracují.

Příklad

if [ ... ]; then ... do this ... else ... do that ... fi 

Komentáře

  • Dobře, tak proč je potřeba " pokud " tedy? Já já an, why " if " even there if " [" by stačilo.
  • Malý nitpick: [[ může být také integrovaný shell.
  • @supertonsky – fungují ale vrátí pouze stav testu, nemohou na něj ' jednat jakýmkoli způsobem. if se chová jako přepínač a provádí příkazy v then bloku, nebo ne, v závislosti na výsledcích vrácených podmíněným. if není ' opravdu nepovinný ve způsobu, jakým ' uvažujete, příklady ukázal použití && což je něco jako if. Pokud podmínka selže, pak příkaz po && aren ' t běhu.
  • @SteveKoch – jako já rozumíte tomu, ] je v této souvislosti argumentem k příkazu [.' Domnívám se, že existují, ale ' nemůžu myslet na žádné z mé hlavy. Pokud jste ' opravdu zvědaví, možná by stálo za to jej zveřejnit jako další Q.
  • @SteveKoch – mimochodem, /usr/bin/[ ukazuje, že je součástí coreutils na mém systému Fedora. O těchto věcech se můžete vždy poradit se zdrojem, pokud chcete přesně vědět, jak takové věci fungují. git.savannah.gnu.org/cgit/coreutils.git

Odpovědět

Ooohh, jedno z mých oblíbených témat !!

Hranaté závorky jsou synonymem pro příkaz „test“. Pokud si přečtete testovací manuálovou stránku, uvidíte, že můžete vyvolat testovací příkaz buď

test -r /etc/profile.d/java.sh 

nebo

[ -r /etc/profile.d/java.sh ] 

Mezery mezi závorkami a položkami uvnitř a vně jsou povinné.

Příkaz“ test „v tomto případě kontroluje, zda soubor / etc / profile.d / java.sh je čitelný pro aktuálního uživatele. Samozřejmostí je kontrola, zda existuje. 🙂

&& je zkratka bash syntaxe pro „pokud je příkaz vlevo úspěšný, pak proveďte příkaz vpravo. Tento složený příkaz je tedy zkratkou pro „if-then“, které by vypadalo takto:

if test -r /etc/profile.d/java.sh then /etc/profile.d/java.sh fi 

Nyní také najdete dvojité hranaté závorky vysvětleno v manuálové stránce bash. Jedná se o interní verzi bash rozšířené testovací funkce. Uvědomte si, že nejsou úplně stejné. Existují věci, které můžete dělat s těmi, které nemůžete dělat pomocí příkazu „test“ a jeho „ [„synonymum.

Komentáře

  • Jen se chci ujistit, že rozumím. Pokud jsou hranaté závorky aliasem " test ", neměl by ' váš druhý příklad být " [- r /etc/profile.d/java.sh] "? Jinými slovy, odstraňte redundantní testovací prohlášení.
  • Ano, pmont, vy ' mám samozřejmě přesně pravdu! Nebyl jsem ' opatrný, když jsem stříhal a vkládal. <

opravili jsme to. Díky!

Napsat komentář

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