Mitä hakasulkeet tarkoittavat ilman “ -kuvaketta, jos ” vasemmalla? [kaksoiskappale]

Tähän kysymykseen on jo annettu vastauksia :

Kommentit

  • Ei kopiota. Toinen kysymys koskee if -lauseketta. Tämä kysymys kysyy, mitä suluissa tarkoitetaan ilman lauseketta if.

Vastaa

Hakasulkeet ovat lyhenteellistä merkintää ehdollisen testin suorittamiseksi. Sulkeet [ ja [[ ovat todellisia komentoja Unixissa, uskokaa tai älkää.

Ajattele:

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

Bashissa [ on sisäänrakennettu komento sekä suoritettava tiedosto. [[ on vain avainsana Bashille.

Esimerkki

Voit vahvistaa tämän valitsemalla type:

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

Näet fyysisen suoritettavan täältä:

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

sisäänrakennetut vs. . avainsanat

Jos katsot Bashin man-sivua man bash, löydät seuraavat määritelmät kahdelle:

  • avainsanat – Varatut sanat ovat sanoja, joilla on erityinen merkitys kuorelle. Seuraavat sanat ovat tunnistetaan varattuina, kun ei-lainausmerkkejä, ja joko yksinkertaisen komennon ensimmäinen sana (katso alla KUOREN KIELIOSA) tai tapauksen tai komennon kolmas sana:

    ! case do done elif else esac fi for function if in select then until while { } time [[ ]] 
  • sisäänrakennetut – Jos komennon nimi ei sisällä kauttaviivoja, komentotulkki yrittää löytää sen. on olemassa kuoritoiminto tällä nimellä, tätä toimintoa kutsutaan yllä kohdassa F kuvatulla tavalla UNCTIONS. Jos nimi ei vastaa toimintoa, kuori etsii sitä sisäänrakennettujen kuorien luettelosta. Jos vastaavuus löytyy, kyseinen sisäänrakennettu tiedosto käynnistetään.

    Jos nimi ei ole kuoritoiminto eikä sisäänrakennettu eikä siinä ole kauttaviivoja, bash etsii PATH: n jokaisesta elementistä hakemistoa, joka sisältää suoritettavan tiedoston tuo nimi. Bash muistaa suoritettavien tiedostojen täydelliset polunimet hash-taulukon avulla (katso hash alla SHELL BUILTIN COMMANDS). Hakemistojen täysi haku PATH: ssa suoritetaan vain, jos komentoa ei löydy hash-taulukosta. Jos haku epäonnistuu, komentotulkki etsii määritettyä kuoritoimintoa nimeltä command_not_found_handle. Jos kyseinen toiminto on olemassa, se kutsutaan alkuperäisen komennon ja alkuperäisen komennon argumentteina argumentiksi, ja funktion poistumistilasta tulee kuoren poistumistila. Jos toimintoa ei ole määritelty, komentotulkki tulostaa virhesanoman ja palauttaa poistumistilan 127.

man-sivu

Jos tarkastelet Bash man -sivu, josta löydät sen yksityiskohdat.

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. 

Viimeiseksi man-sivulta:

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

MUOKKAA # 1

Jatkokysymys OP: sta.

Ok, niin miksi tarve ”jos” niin? Tarkoitan, miksi ”jos” edes on olemassa, jos ”[” riittää.

if on ehdollinen. Komento test tai [ ... ] -komento yksinkertaisesti arvioi ehdollisen ja palauttaa arvon 0 tai a 1. If-käsky toimii sitten 0: n tai 1: n kanssa. 2 toimivat yhdessä, kun käytät niitä.

Esimerkki

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

Kommentit

  • Ok, niin miksi " tarvitaan, jos "

jos " on edes olemassa, jos " [" riittää.

  • Pikku nitpick: [[ voi olla myös sisäänrakennettu kuori.
  • @supertonsky – ne toimivat mutta he palauttavat vain testin tilan, eivät voi ' toimia millään tavalla. if toimii kytkimen tavoin ja suorittaa komennot lohkossa then tai ei, ehdollisen palauttamien tulosten mukaan. if ei ole ' ei todellakaan valinnainen tavalla, jolla ' ajattelet, esimerkkejä meistä osoitti käytön &&, joka on eräänlainen kuin if. Jos ehdollinen epäonnistuu, komento && jälkeen ei ole ' t suoritettavissa.
  • @SteveKoch – kuten minä ymmärrä se, ] on argumentti tässä yhteydessä komennolle [.I ' luulen, että niitä on, mutta en voi ' ajatella mitään pääni yläosasta. Saattaa olla syytä lähettää se uudeksi Q: ksi, jos ' olet todella utelias.
  • @SteveKoch – muuten /usr/bin/[ näkyy osana Fedora-järjestelmän ydinominaisuuksia. Voit aina kysyä lähteeltä näistä asioista, jos haluat tietää tarkalleen, miten tällaiset asiat toimivat. git.savannah.gnu.org/cgit/coreutils.git
  • Vastaa

    Ooohh, yksi suosikkiaiheistani !!

    Sulkeet ovat synonyymi ”test” -komennolle. Jos luet testisivun, näet, että voit kutsua testikomennon joko

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

    tai

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

    Sulujen ja niiden sisällä ja ulkopuolella olevien välien välit ovat pakollisia.

    Tässä tapauksessa komento” test ”tarkistaa, onko tiedosto / etc / profile.d / java.sh on luettavissa nykyiselle käyttäjälle. Tämä tarkoittaa tietysti, onko se olemassa. 🙂

    && on bash-syntaksin pikakuvake ”jos vasemmanpuoleinen komento onnistuu, suorita komento oikealla. Joten tämä yhdistetty komento on lyhenne sanoille ”jos-niin”, joka näyttäisi tältä:

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

    Löydät nyt myös kaksoissulkeet selitetään bashin man-sivulla. Nämä ovat laajennetun testaustoiminnon bash-sisäinen versio. Huomaa, että ne eivät ole täysin samat. On asioita, joita voit tehdä niiden kanssa, joita et voi tehdä ”test” -komennolla ja sen ” [”synonyymi.

    Kommentit

    • Haluan vain varmistaa, että ymmärrän. Jos hakasulkeet ovat aliaksen kohteelle " test ", ei pidä ' t toinen esimerkkisi olla " [- r /etc/profile.d/java.sh] "? Toisin sanoen poista tarpeeton testilauseke.
    • Kyllä, pmont, sinä ' on tietysti aivan oikein! En ollut ' varovainen leikatessani ja liittäessäni. I ' olen korjannut sen. Kiitos!

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *