Wat betekenen vierkante haken zonder de “ als ” aan de linkerkant? [duplicate]

Deze vraag heeft hier al antwoorden :

Reacties

  • Geen duplicaat. De andere vraag gaat over het if statement. Deze vraag stelt de betekenis van haakjes zonder een if -verklaring.

Antwoord

Vierkante haken zijn een verkorte notatie voor het uitvoeren van een voorwaardelijke test. De haakjes [, evenals [[ zijn echte commandos binnen Unix, geloof het of niet.

Denk aan:

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

In Bash is [ zowel een ingebouwd commando als een uitvoerbaar bestand. [[ is slechts een trefwoord voor Bash.

Voorbeeld

Je kunt dit bevestigen met type:

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

Je kunt het fysieke uitvoerbare bestand hier zien:

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

ingebouwde vs. . keywords

Als je de Bash man-pagina bekijkt, man bash, vind je de volgende definities voor de 2:

  • keywords – Gereserveerde woorden zijn woorden die een speciale betekenis hebben voor de shell. De volgende woorden zijn herkend als gereserveerd indien niet geciteerd en ofwel het eerste woord van een eenvoudig commando (zie SHELL GRAMMAR hieronder) of het derde woord van een hoofdletter of voor commando:

    ! case do done elif else esac fi for function if in select then until while { } time [[ ]] 
  • ingebouwde – Als de commandonaam geen schuine strepen bevat, probeert de shell deze te lokaliseren. bestaat een shell-functie met die naam, die functie wordt aangeroepen zoals hierboven beschreven in F UNCTIES. Als de naam niet overeenkomt met een functie, zoekt de shell ernaar in de lijst met ingebouwde shell. Als een overeenkomst wordt gevonden, wordt die ingebouwde functie aangeroepen.

    Als de naam geen shell-functie of een ingebouwde naam is en geen schuine strepen bevat, doorzoekt bash elk element van de PATH naar een map met een uitvoerbaar bestand door die naam. Bash gebruikt een hashtabel om de volledige padnamen van uitvoerbare bestanden te onthouden (zie hash onder SHELL BUILTIN COMMANDS hieronder). Een volledige doorzoeking van de mappen in PATH wordt alleen uitgevoerd als de opdracht niet in de hashtabel wordt gevonden. Als de zoekopdracht niet succesvol is, zoekt de shell naar een gedefinieerde shell-functie genaamd command_not_found_handle. Als die functie bestaat, wordt deze aangeroepen met het originele commando en de oorspronkelijke argumenten van het commando als zijn argumenten, en de exit-status van de functie wordt de exit-status van de shell. Als die functie niet is gedefinieerd, drukt de shell een foutmelding af en retourneert de exit-status 127.

man-pagina

Als je door de Bash man-pagina “vindt u de details erop.

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. 

Ten slotte van de man-pagina:

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

EDIT # 1

Vervolgvraag van het OP.

Ok, dus waarom is er een behoefte aan een “als” dan? Ik bedoel, waarom “als” zelfs bestaat als “[” zou volstaan.

De if maakt deel uit van een voorwaardelijke. De test -opdracht of [ ... ] -opdracht evalueert eenvoudig de voorwaardelijke en retourneert een 0 of a 1. De 0 of 1 wordt vervolgens verwerkt door de if-instructie. De 2 werken samen wanneer u ze gebruikt.

Voorbeeld

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

Reacties

  • Ok, dus waarom is er een " nodig als " dan? ik ik an, waarom " als " zelfs bestaat als " [" zou voldoende zijn.
  • Kleine muggenzifterij: [[ kan ook een ingebouwde shell zijn.
  • @supertonsky – ze werken maar ze geven alleen de status van de test terug, ze kunnen ' er op geen enkele manier op reageren. De if fungeert als een schakelaar en voert de opdrachten uit in het then -blok of niet, afhankelijk van de resultaten die worden geretourneerd door de conditionele. if isn ' t echt optioneel in de manier waarop je ' denkt, de voorbeelden zijn toonde gebruik && wat een beetje lijkt op de if. Als de conditionele mislukt, wordt het commando na de && niet ' uitgevoerd.
  • @SteveKoch – zoals ik begrijp het, de ] is in deze context een argument voor het commando [.Ik ' vermoedde dat die er zijn, maar ik kan ' niets boven mijn hoofd bedenken. Het kan de moeite waard zijn om het als een andere Q te posten als je ' echt nieuwsgierig bent.
  • @SteveKoch – overigens /usr/bin/[ shows als onderdeel van de coreutils op mijn Fedora-systeem. Als u precies wilt weten hoe dat in zijn werk gaat, kunt u hierover altijd de bron raadplegen. git.savannah.gnu.org/cgit/coreutils.git

Antwoord

Ooohh, een van mijn favoriete onderwerpen !!

Vierkante haken zijn een synoniem voor het “test” -commando. Als u de testman-pagina leest, “zult u zien dat u het testcommando kunt aanroepen als

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

of

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

De spaties tussen de haakjes en de dingen erin en erbuiten zijn verplicht.

Het” test “-commando in dit geval controleert of het bestand / etc / profile.d / java.sh is leesbaar voor de huidige gebruiker. Impliciet is natuurlijk een controle om te zien of het bestaat. 🙂

De && is een sneltoets voor bash-syntaxis voor “als het commando aan de linkerkant slaagt, voer dan het commando aan de rechterkant uit. Dus dit samengestelde commando is een afkorting voor een “if-then” die er als volgt uit zou zien:

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

Nu zul je ook dubbele vierkante haken vinden uitgelegd in de bash man-pagina. Dat is een bash interne versie van een uitgebreide testfunctie. Houd er rekening mee dat deze niet precies hetzelfde zijn. Er zijn dingen die je kunt doen met degene die je niet kunt doen met het “test” -commando en zijn ” [“synonym.

Opmerkingen

  • Ik wil alleen zeker weten of ik het begrijp. Of vierkante haken een alias zijn voor " test ", zou ' t uw tweede voorbeeld " [- r /etc/profile.d/java.sh] "? Met andere woorden, verwijder de overtollige testverklaring.
  • Ja, pmont, jij ' klopt natuurlijk helemaal! Ik was niet ' niet voorzichtig met knippen en plakken. Ik ' heb het opgelost. Bedankt!

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *