Che cosa significano le parentesi quadre senza “ se ” a sinistra? [duplicate]

Questa domanda ha già una risposta qui :

Commenti

  • Non è un duplicato. Laltra domanda riguarda listruzione if. Questa domanda chiede cosa significano le parentesi senza unistruzione if.

Risposta

Le parentesi quadre sono una notazione abbreviata per eseguire un test condizionale. Le parentesi [ e [[ sono comandi effettivi allinterno di Unix, che tu ci creda o no.

Pensa:

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

In Bash [ è un comando integrato oltre che un eseguibile. [[ è solo una parola chiave per Bash.

Esempio

Puoi confermarlo utilizzando type:

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

Puoi vedere leseguibile fisico qui:

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

builtins vs .parole chiave

Se dai unocchiata alla pagina man di Bash, man bash, troverai le seguenti definizioni per 2:

  • parole chiave – Le parole riservate sono parole che hanno un significato speciale per la shell. Le seguenti parole sono riconosciuto come riservato quando non quotato e sia la prima parola di un semplice comando (vedi GRAMMATICA DELLA CONCHIGLIA sotto) o la terza parola di un caso o per il comando:

    ! case do done elif else esac fi for function if in select then until while { } time [[ ]] 
  • builtins – Se il nome del comando non contiene barre, la shell tenta di individuarlo. Se è presente esiste una funzione di shell con quel nome, quella funzione è invocata come descritto sopra in F UNZIONI. Se il nome non corrisponde a una funzione, la shell lo cerca nellelenco dei comandi incorporati della shell. Se viene trovata una corrispondenza, viene richiamato quel builtin.

    Se il nome non è né una funzione di shell né un builtin e non contiene barre, bash cerca in ogni elemento del PATH una directory contenente un file eseguibile quel nome. Bash utilizza una tabella hash per ricordare i nomi di percorso completi dei file eseguibili (vedere hash sotto COMANDI INTEGRATI SHELL di seguito). Una ricerca completa delle directory in PATH viene eseguita solo se il comando non viene trovato nella tabella hash. Se la ricerca ha esito negativo, la shell cerca una funzione di shell definita denominata command_not_found_handle. Se quella funzione esiste, viene invocata con il comando originale e gli argomenti del comando originale come argomenti, e lo stato di uscita della funzione diventa lo stato di uscita della shell. Se quella funzione non è definita, la shell stampa un messaggio di errore e restituisce uno stato di uscita di 127.

pagina man

Se guardi nella Nella pagina man di Bash “troverai i dettagli.

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. 

Infine dalla pagina man:

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

EDIT # 1

Domanda di follow-up dallOP.

Ok, allora perché cè un hai bisogno di un “se” allora? Voglio dire, perché “se” esiste anche se “[” sarebbe sufficiente.

Il if fa parte di un condizionale. Il comando test o [ ... ] valuta semplicemente il condizionale e restituisce 0 o a 1. Lo 0 o l1 viene quindi applicato dallistruzione if. I 2 lavorano insieme quando vengono utilizzati.

Esempio

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

Commenti

  • Ok, allora perché è necessario un " se " allora? io io an, perché " se " esiste anche se " [" sarebbe sufficiente.
  • Un po di nitpick: [[ potrebbe anche essere una shell incorporata.
  • @supertonsky – funzionano ma restituiscono solo lo stato del test, non possono ' agire su di esso in alcun modo. Il if agisce come un interruttore ed esegue i comandi nel blocco then o meno a seconda dei risultati restituiti dal condizionale. if non è ' davvero facoltativo nel modo in cui ' stai pensando, gli esempi che mostrava luso di && che è un po come if. Se il condizionale fallisce, il comando dopo && aren ' t eseguito.
  • @SteveKoch – come io capiscilo, ] è un argomento in questo contesto per il comando [.' immagino che ce ne siano, ma non riesco ' a pensare a nessuno sopra la mia testa. Potrebbe valere la pena pubblicarlo come un altro Q se ' sei veramente curioso.
  • @SteveKoch – incidentalmente, /usr/bin/[ mostra come parte dei coreutils sul mio sistema Fedora. Puoi sempre consultare la fonte su questi argomenti se vuoi sapere esattamente come funzionano queste cose. git.savannah.gnu.org/cgit/coreutils.git

Risposta

Ooohh, uno dei miei argomenti preferiti !!

Le parentesi quadre sono un sinonimo del comando “test”. Se leggi la pagina man di test, vedrai che puoi invocare il comando test come

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

o

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

Gli spazi tra le parentesi e le cose dentro e fuori sono obbligatori.

Il comando” test “in questo caso sta controllando se il file / etc / profile.d / java.sh è leggibile dallutente corrente. Implicito è un controllo per vedere se esiste, ovviamente. 🙂

Il && è una scorciatoia della sintassi bash per “se il comando a sinistra ha successo, allora esegui il comando a destra. Quindi, questo comando composto è unabbreviazione per un “se-allora” che sarebbe simile a questo:

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

Ora troverai anche doppie parentesi quadre spiegato nella pagina man di bash. Quelle sono una versione interna di bash di una funzione di test estesa. Tieni presente che non sono esattamente le stesse. Ci sono cose che puoi fare con quelle che non puoi fare con il comando “test” e il suo ” [“sinonimo.

Commenti

  • Voglio solo assicurarmi di aver capito. Se le parentesi quadre sono un alias per " test ", ' il tuo secondo esempio non dovrebbe essere " [- r /etc/profile.d/java.sh] "? In altre parole, rimuovere listruzione di test ridondante.
  • Sì, pmont, tu ' hai esattamente ragione, ovviamente! ' non facevo attenzione quando tagliavo e incollavo. ' lho risolto. Grazie!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *