Mit jelentenek a szögletes zárójelek a “ nélkül, ha a bal oldali ”? [duplicate]

Erre a kérdésre már itt vannak válaszok :

megjegyzések

  • nem másolatok. A másik kérdés a if utasításra vonatkozik. Ez a kérdés azt kérdezi, hogy mit jelentenek a zárójelek if utasítás nélkül.

Válasz

A szögletes zárójelek rövidített jelölést jelentenek a feltételes teszt elvégzéséhez. A [ zárójelek, valamint az [[ tényleges parancsok a Unixon belül, akár hiszed, akár nem.

Gondolj:

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

A Bash-ben a [ egy beépített parancs, valamint egy futtatható fájl. Az [[ csak egy kulcsszó a Bash-hoz.

Példa

Ezt a type:

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

A fizikai végrehajtható fájl itt látható:

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

beépített vs . kulcsszavak

Ha megnézi a Bash man oldalt, man bash, akkor a következő definíciókat találja a kettőhöz:

  • kulcsszavak – A lefoglalt szavak olyan szavak, amelyek különleges jelentéssel bírnak a héj számára. A következő szavak: fenntartva, ha nem idézik, és vagy egy egyszerű parancs első szava (lásd alább a HÉTVEGYESZKÖZT), vagy egy eset harmadik szava, vagy parancsra:

    ! case do done elif else esac fi for function if in select then until while { } time [[ ]] 
  • beépített – Ha a parancs neve nem tartalmaz perjelet, akkor a shell megkísérli megtalálni. létezik egy shell függvény ezen a néven, ezt a függvényt az F-ben fent leírtak szerint hívjuk meg UNCTIONS. Ha a név nem felel meg egy függvénynek, akkor a shell megkeresi a shell beépítettek listáján. Ha talál egyezést, akkor a beépítettet meghívjuk.

    Ha a név nem shell vagy függvény, és nem tartalmaz perjelet, a bash a PATH minden elemében keres egy könyvtárat, amely futtatható fájlt tartalmaz ezt a nevet. A Bash hash táblázattal emlékezik a futtatható fájlok teljes elérési útjára (lásd a hash alatt a SHELL BUILTIN COMMANDS alatt). A PATH könyvtárak teljes keresése csak akkor történik, ha a parancs nem található a hash táblában. Ha a keresés sikertelen, akkor a shell egy definiált shell függvényt keres, amelynek neve: command_not_found_handle. Ha ez a függvény létezik, akkor az eredeti paranccsal és az eredeti parancs argumentumaival hívják meg, és a függvény kilépési állapota a shell kilépési állapotává válik. Ha ez a függvény nincs meghatározva, akkor a shell hibaüzenetet nyomtat, és a 127. kilépési állapotot adja vissza.

man oldal

Ha átnézi a Bash man oldalt megtalálja rajta a részletekről.

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. 

Végül a man oldalról:

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

# 1 SZERKESZTÉS

Az OP nyomon követési kérdése.

Ok, akkor miért van akkor szükség van egy “ha” -ra? Úgy értem, miért létezik “ha”, még akkor is, ha a “[” elegendő lenne.

A egy feltétel feltétele. A test vagy [ ... ] parancs egyszerűen kiértékeli a feltételt, és 0 vagy a 1. A 0 vagy 1 értéket az if utasítás követi. A 2 együtt működik, amikor használja őket.

Példa

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

Megjegyzések

  • Rendben, akkor miért van szükség " -re, ha "

ha " akkor is létezik, ha " [" elegendő lenne.

  • Kis nitpick: [[ lehet egy beépített shell is.
  • @supertonsky – működnek de csak a teszt állapotát adják vissza, semmilyen módon nem tudnak ' cselekedni. A if kapcsolóként működik, és a feltételeketől kapott eredmények függvényében végrehajtja a parancsokat a then blokkban, vagy sem. if nem ' nem igazán választható abban a módon, ahogyan ' gondolkodsz, a példák, amelyeket a && használatát mutatta, ami hasonló a if -hez. Ha a feltétel nem sikerül, akkor a && utáni parancs nem ' fut.
  • @SteveKoch – ahogy én értsd meg, a ] ebben az összefüggésben argumentum a [ parancsra.' sejthetem, hogy vannak, de ' nem gondolhatok semmit a fejem tetejéről. Érdemes lehet újabb Q-ként feltenni, ha ' valóban kíváncsi vagy.
  • @SteveKoch – mellesleg /usr/bin/[ azt mutatja, hogy a Fedora rendszerem alaptevékenységének része. Mindig konzultálhat a forrással ezekben a kérdésekben, ha pontosan meg akarja tudni, hogyan működnek ilyen dolgok. git.savannah.gnu.org/cgit/coreutils.git
  • Válasz

    Óóóó, az egyik kedvenc témám !!

    A szögletes zárójelek a “teszt” parancs szinonimái. Ha elolvassa a teszt man oldalát, akkor látni fogja, hogy a teszt parancsot meghívhatja

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

    vagy

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

    Szükség van a zárójelek és a bennük és kívül található dolgok közötti szóközökre.

    A” teszt “parancs ebben az esetben azt ellenőrzi, hogy az / etc / fájl A profile.d / java.sh az aktuális felhasználó számára olvasható. Ez magában foglalja annak ellenőrzését, hogy létezik-e, természetesen. 🙂

    A && egy bash szintaxis parancsikon a következőre: “ha a bal oldali parancs sikeres, akkor hajtsa végre a jobb oldali parancsot. Tehát ez az összetett parancs rövidítése egy “ha-akkor” -nak, amely így nézne ki:

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

    Most kettős szögletes zárójelet is talál elmagyarázta a bash man oldalon. Ezek egy kiterjesztett tesztfunkció belső verziója. Ne feledje, hogy ezek nem teljesen ugyanazok. Vannak dolgok, amelyeket nem a “test” paranccsal és annak ” [“szinonima.

    Megjegyzések

    • Csak szeretném meggyőződni arról, hogy értem-e. Ha a szögletes zárójelek a " teszt ", nem kéne ' t a második példád " [- r /etc/profile.d/java.sh] "? Más szavakkal, távolítsa el a felesleges tesztnyilatkozatot.
    • Igen, pmont, te ' természetesen teljesen igaza van! Nem voltam ' óvatos, amikor vágtam és beillesztettem. I ' kijavítottam. Köszönöm!

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük