Hva betyr hakeparenteser uten “ hvis ” til venstre? [duplikat]

Dette spørsmålet har allerede svar her :

Kommentarer

  • Ikke et duplikat. Det andre spørsmålet spør om if uttalelsen. Dette spørsmålet spør hva parenteser betyr uten en if uttalelse.

Svar

Firkantede parenteser er en stikkordnotasjon for å utføre en betinget test. Parentesene [, så vel som [[ er faktiske kommandoer i Unix, tro det eller ei.

Tenk:

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

I Bash er [ en innebygd kommando så vel som en kjørbar. [[ er bare et nøkkelord for Bash.

Eksempel

Du kan bekrefte dette ved hjelp av type:

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

Du kan se den fysiske kjørbare her:

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

builtins vs. . nøkkelord

Hvis du tar en titt på Bash-mansiden man bash, vil du finne følgende definisjoner for 2:

  • nøkkelord – Reserverte ord er ord som har en spesiell betydning for skallet. Følgende ord er gjenkjent som reservert når det ikke er sitert og enten det første ordet i en enkel kommando (se SHELL GRAMMAR nedenfor) eller det tredje ordet i en sak eller for kommando:

    ! case do done elif else esac fi for function if in select then until while { } time [[ ]] 
  • builtins – Hvis kommandonavnet ikke inneholder skråstreker, prøver skallet å finne det. eksisterer en skallfunksjon med det navnet, den funksjonen påkalles som beskrevet ovenfor i F UNKJONER. Hvis navnet ikke samsvarer med en funksjon, søker skallet etter det i listen over skallinnbygginger. Hvis en samsvar blir funnet, blir den innebygde påkalt.

    Hvis navnet verken er en skallfunksjon eller en innebygd, og ikke inneholder skråstreker, søker bash hvert element i PATH etter en katalog som inneholder en kjørbar fil av det navnet. Bash bruker en hash-tabell for å huske hele stienavnene til kjørbare filer (se hash under SHELL BUILTIN COMMANDS nedenfor). Et fullstendig søk av katalogene i PATH utføres bare hvis kommandoen ikke finnes i hash-tabellen. Hvis søket mislykkes, søker skallet etter en definert skallfunksjon med navnet command_not_found_handle. Hvis denne funksjonen eksisterer, blir den påkalt med den opprinnelige kommandoen og den opprinnelige kommandoens argumenter som argumenter, og funksjonens avslutningsstatus blir utgangsstatus for skallet. Hvis denne funksjonen ikke er definert, skriver skallet ut en feilmelding og returnerer en utgangsstatus på 127.

manside

Hvis du ser gjennom Bash man-side du vil finne detaljene på den.

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. 

Til slutt fra man-siden:

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

EDIT # 1

Oppfølgingsspørsmål fra OP.

Ok, så hvorfor er det en behov for et «hvis» da? Jeg mener, hvorfor «hvis» til og med eksisterer hvis «[» ville være tilstrekkelig.

if er en del av en betinget. Kommandoen test eller [ ... ] evaluerer bare den betingede, og returnerer en 0 eller a 1. 0 eller 1 blir deretter utført av if-setningen. De 2 jobber sammen når du bruker dem.

Eksempel

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

Kommentarer

  • Ok, så hvorfor er det behov for et " hvis " da? Jeg meg an, hvorfor " hvis " til og med eksisterer hvis " [" vil være tilstrekkelig.
  • Lille nitpick: [[ kan også være et innebygd skall.
  • @supertonsky – de fungerer men de returnerer bare testens status, de kan ' ikke handle på den på noen måte. if fungerer som en bryter og utfører kommandoene i then -blokken eller ikke, avhengig av resultatene som returneres av den betingede. if er ikke ' t virkelig valgfritt på den måten du ' tenker på, eksemplene vi viste bruk && som er liksom if. Hvis den betingede mislykkes, kjøres ikke kommandoen etter && '.
  • @SteveKoch – som jeg forstår det, er ] et argument i denne sammenhengen til kommandoen [.Jeg ' Jeg antar at det er det, men jeg kan ' ikke tenke på noe fra toppen av hodet mitt. Det kan være verdt å legge det ut som en annen Q hvis du ' er virkelig nysgjerrig.
  • @SteveKoch – forøvrig /usr/bin/[ viser seg å være en del av coreutils på Fedora-systemet mitt. Du kan alltid konsultere kilden om disse spørsmålene hvis du vil vite nøyaktig hvordan slike ting fungerer. git.savannah.gnu.org/cgit/coreutils.git

Svar

Ooohh, et av favorittemnene mine !!

Firkantede parenteser er et synonym for «test» -kommandoen. Hvis du leser testman-siden, vil du se at du kan påkalle testkommandoen som enten

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

eller

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

Mellomromene mellom parentesene og tingene inni og utenfor dem er påkrevd.

Kommandoen» test «i dette tilfellet kontrollerer om filen / etc / profile.d / java.sh kan leses for den nåværende brukeren. Underforstått er en sjekk for å se om den eksisterer, selvfølgelig. 🙂

&& er en bash-syntaks-snarvei for «hvis kommandoen til venstre lykkes, så utfør kommandoen til høyre. Så denne sammensatte kommandoen er en forkortelse for en «hvis-da» som vil se slik ut:

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

Nå vil du også finne doble hakeparenteser forklart i bash man-siden. Dette er en bash intern versjon av en utvidet testfunksjon. Vær oppmerksom på at de ikke er helt like. Det er ting du kan gjøre med de som du ikke kan gjøre med «test» -kommandoen og dens » [«synonym.

Kommentarer

  • Vil bare være sikker på at jeg forstår det. Hvis hakeparenteser er et alias for " test ", burde ikke ' t ditt andre eksempel være " [- r /etc/profile.d/java.sh] "? Med andre ord, fjern den overflødige testuttalelsen.
  • Ja, pmont, du ' er helt riktig, selvfølgelig! Jeg var ikke ' t forsiktig når jeg klippet og limte inn. Jeg ' har fikset det. Takk!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *