Vad betyder hakparenteser utan “ om ” till vänster? [duplicera]

<åt sidan class = "s-notice s-notice__info js-post-notice mb16" role = "status">

Denna fråga har redan svar här :

Kommentarer

  • Inte en duplikat. Den andra frågan ställer om uttalandet if. Denna fråga frågar vad parenteser betyder utan ett if uttalande.

Svar

Hakparenteser är en förkortning för att utföra ett villkorligt test. Parenteserna [, liksom [[, är faktiska kommandon inom Unix, tro det eller inte.

Tänk:

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

I Bash är [ ett inbyggt kommando såväl som en körbar. [[ är bara ett nyckelord till Bash.

Exempel

Du kan bekräfta detta med type:

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

Du kan se den fysiska körningen här:

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

builtins vs . nyckelord

Om du tittar på Bash-mansidan man bash hittar du följande definitioner för de 2:

  • nyckelord – Reserverade ord är ord som har en speciell betydelse för skalet. Följande ord är känd som reserverad när den inte citeras och antingen det första ordet i ett enkelt kommando (se SHELL GRAMMAR nedan) eller det tredje ordet i ett fall eller för kommando:

    ! case do done elif else esac fi for function if in select then until while { } time [[ ]] 
  • builtins – Om kommandonamnet inte innehåller några snedstreck försöker skalet att hitta det. existerar en skalfunktion med det namnet, den funktionen åberopas enligt beskrivningen ovan i F FUNKTIONER. Om namnet inte matchar en funktion, söker skalet efter det i listan över inbyggda skal. Om en matchning hittas åberopas det inbyggda.

    Om namnet varken är en skalfunktion eller ett inbyggt, och inte innehåller några snedstreck, söker bash i varje element i PATH efter en katalog som innehåller en körbar fil av det namnet. Bash använder en hash-tabell för att komma ihåg hela sökvägen för körbara filer (se hash under SHELL BUILTIN-KOMMANDON nedan). En fullständig sökning av katalogerna i PATH utförs endast om kommandot inte finns i hashtabellen. Om sökningen misslyckas söker skalet efter en definierad skalfunktion med namnet command_not_found_handle. Om den funktionen existerar, anropas den med det ursprungliga kommandot och det ursprungliga kommandot: s argument som dess argument, och funktionens utgångsstatus blir utgångsstatus för skalet. Om den funktionen inte är definierad skriver ut skalet ett felmeddelande och returnerar en utgångsstatus på 127.

man-sida

Om du tittar igenom Bash man-sida hittar du detaljerna 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. 

Slutligen från mansidan:

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

EDIT # 1

Uppföljningsfråga från OP.

Okej, så varför finns det en behov av ett ”om” då? Jag menar, varför ”om” ens finns om ”[” skulle räcka.

if är en del av ett villkor. Kommandot test eller [ ... ] utvärderar helt enkelt villkoret och returnerar ett 0 eller a 1. 0 eller 1 påverkas sedan av if-uttalandet. De 2 arbetar tillsammans när du använder dem.

Exempel

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

Kommentarer

  • Okej, så varför finns det ett behov av ett " om " då? Jag jag an, varför " om " existerar om " [" räcker.
  • Liten nitpick: [[ kan också vara ett inbyggt skal.
  • @supertonsky – de fungerar men de returnerar bara testets status, de kan ' inte agera på det på något sätt. if fungerar som en omkopplare och utför kommandona i then -blocket eller inte beroende på resultaten som returneras av den villkorade. if isn ' t verkligen valfritt på det sätt du ' tänker på, exemplen vi visade användning && vilket är ungefär som if. Om villkoret misslyckas, körs kommandot efter && ' t.
  • @SteveKoch – som jag förstår det, ] är ett argument i detta sammanhang mot kommandot [.Jag ' gissar att det finns men jag kan ' tänka på något ovanför mitt huvud. Det kan vara värt att lägga upp det som en annan Q om du ' är riktigt nyfiken.
  • @SteveKoch – för övrigt /usr/bin/[ visar sig vara en del av kärnanvändningarna i mitt Fedora-system. Du kan alltid konsultera källan om dessa frågor om du vill veta exakt hur sådana saker fungerar. git.savannah.gnu.org/cgit/coreutils.git

Svar

Ooohh, ett av mina favoritämnen !!

Fyrkantiga parenteser är en synonym för kommandot ”test”. Om du läser testman-sidan kommer du att se att du kan åberopa testkommandot antingen

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

eller

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

Mellanrummen mellan parenteserna och grejerna inom och utanför dem krävs.

Kommandot” test ”kontrollerar i detta fall om filen / etc / profile.d / java.sh är läsbar för den nuvarande användaren. Underförstått är en kontroll för att se om den existerar, förstås. 🙂

&& är en bash-syntaxgenväg för ”om kommandot till vänster lyckas, kör sedan kommandot till höger. Så det här sammansatta kommandot är en förkortning för en ”if-then” som skulle se ut så här:

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

Nu hittar du också dubbla hakparenteser förklaras i bash man-sidan. Det här är en bash-intern version av en utökad testfunktion. Var medveten om att de inte är exakt samma. Det finns saker du kan göra med de som du inte kan göra med kommandot ”test” och dess ” [”synonym.

Kommentarer

  • Vill bara se till att jag förstår. Om hakparenteser är ett alias för " test ", ska inte ' t ditt andra exempel är " [- r /etc/profile.d/java.sh] "? Med andra ord, ta bort det överflödiga testuttrycket.
  • Ja, pmont, du ' är naturligtvis exakt rätt! Jag var inte ' t försiktig när jag klippte och klistrade in. Jag ' har fixat det. Tack!

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *