Komentáře
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 vthen
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 jakoif
. 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!
if
. Tato otázka se ptá, co závorky znamenají bez prohlášeníif
.