Hvad betyder firkantede parenteser uden “ hvis ” til venstre? [duplikat]

Dette spørgsmål har allerede svar her :

Kommentarer

  • Ikke en duplikat. Det andet spørgsmål stiller sig til if udsagnet. Dette spørgsmål spørger, hvad parenteser betyder uden en if udsagn.

Svar

Firkantede parenteser er en stenografisk notation til udførelse af en betinget test. Parenteser [ samt [[ er faktiske kommandoer inden for Unix, tro det eller ej.

Tænk:

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

I Bash er [ en indbygget kommando såvel som en eksekverbar. [[ er bare et nøgleord til Bash.

Eksempel

Du kan bekræfte dette ved hjælp af type:

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

Du kan se den fysiske eksekverbare her:

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

builtins vs . nøgleord

Hvis du kigger på Bash-mandsiden man bash, finder du følgende definitioner for de 2:

  • nøgleord – Reserverede ord er ord, der har en særlig betydning for skallen. Følgende ord er anerkendt som reserveret, når det ikke er citeret, og enten det første ord i en simpel kommando (se SHELL GRAMMAR nedenfor) eller det tredje ord i en sag eller til kommando:

    ! case do done elif else esac fi for function if in select then until while { } time [[ ]] 
  • builtins – Hvis kommandonavnet ikke indeholder skråstreger, forsøger skallen at finde det. Hvis der eksisterer en skalfunktion ved det navn, denne funktion påberåbes som beskrevet ovenfor i F UNKTIONER. Hvis navnet ikke matcher en funktion, søger skallen efter den på listen over shell-indbyggede. Hvis der findes et match, påkaldes den indbyggede.

    Hvis navnet hverken er en skalfunktion eller en indbygget og ikke indeholder skråstreg, søger bash hvert element i PATH efter en mappe, der indeholder en eksekverbar fil af det navn. Bash bruger en hash-tabel til at huske de fulde stienavne på eksekverbare filer (se hash under SHELL BUILTIN COMMANDS nedenfor). En fuld søgning af mapperne i PATH udføres kun, hvis kommandoen ikke findes i hash-tabellen. Hvis søgningen ikke lykkes, søger skallen efter en defineret skalfunktion ved navn command_not_found_handle. Hvis denne funktion eksisterer, påkaldes den med den oprindelige kommando og den oprindelige kommandos argumenter som dens argumenter, og funktionens exitstatus bliver shellens exitstatus. Hvis denne funktion ikke er defineret, udskriver shell en fejlmeddelelse og returnerer en exitstatus på 127.

man-side

Hvis du ser gennem Bash mandside, du finder detaljerne 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. 

Endelig fra mandsiden:

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

EDIT # 1

Opfølgningsspørgsmål fra OP.

Ok, så hvorfor er der en behov for et “hvis” så? Jeg mener, hvorfor “hvis” overhovedet findes, hvis “[” ville være tilstrækkelig.

if er en del af en betinget kommando. test -kommandoen eller [ ... ] -kommandoen vurderer blot den betingede og returnerer en 0 eller a 1. 0 eller 1 handles derefter af if-sætningen. De 2 arbejder sammen, når du bruger dem.

Eksempel

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

Kommentarer

  • Ok, så hvorfor er der behov for en " hvis " så? Jeg mig en, hvorfor " hvis " endda findes, hvis " [" ville være tilstrækkelig.
  • Lille nitpick: [[ kan også være en shell-indbygget.
  • @supertonsky – de fungerer men de returnerer kun testens status, de kan ' ikke handle på den på nogen som helst måde. if fungerer som en switch og udfører kommandoerne i then -blokken eller ikke afhængigt af de resultater, der returneres af den betingede. if isn ' t virkelig valgfri på den måde, du ' tænker på, eksemplerne vi viste brug && hvilket er ligesom if. Hvis den betingede mislykkes, køres kommandoen efter && ikke ' t.
  • @SteveKoch – som jeg forstå det, ] er et argument i denne sammenhæng til kommandoen [.Jeg ' gætter på, at der er, men jeg kan ' ikke tænke på noget fra toppen af mit hoved. Det kan være værd at sende det som en anden Q, hvis du ' er virkelig nysgerrig.
  • @SteveKoch – i øvrigt /usr/bin/[ viser sig at være en del af coreutils på mit Fedora-system. Du kan altid høre kilden om disse forhold, hvis du vil vide nøjagtigt, hvordan sådanne ting fungerer. git.savannah.gnu.org/cgit/coreutils.git

Svar

Ooohh, et af mine yndlingsemner !!

Firkantede parenteser er et synonym for kommandoen “test”. Hvis du læser testmandssiden, vil du se, at du kan påkalde testkommandoen som enten

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

eller

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

Mellemrummet mellem parenteserne og tingene indeni og uden for dem er påkrævet.

Kommandoen” test “kontrollerer i dette tilfælde, om filen / etc / profile.d / java.sh kan læses for den nuværende bruger. Underforstået er en kontrol for at se, om den eksisterer selvfølgelig. 🙂

&& er en bash-syntaksgenvej til “hvis kommandoen til venstre lykkes, skal du udføre kommandoen til højre. Så denne sammensatte kommando er en stenografi for en “hvis-så”, der ser sådan ud:

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

Nu finder du også dobbelte firkantede parenteser forklaret i bash man-siden. Disse er en bash intern version af en udvidet testfunktion. Vær opmærksom på, at de ikke er nøjagtigt de samme. Der er ting, du kan gøre med dem, som du ikke kan gøre med kommandoen “test” og dens ” [“synonym.

Kommentarer

  • Vil bare sørge for, at jeg forstår. Hvis firkantede parenteser er et alias for " test ", skal ' t dit andet eksempel være " [- r /etc/profile.d/java.sh] "? Med andre ord skal du fjerne den overflødige testerklæring.
  • Ja, pmont, du ' er selvfølgelig helt rigtigt! Jeg var ikke ' t forsigtig, når jeg skar og klistrede. Jeg ' har ordnet det. Tak!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *