2016-06-23 67 views
5

Credo che entrambe le seguenti frammenti di codice sono valide in POSIX shell compatibile:Devo usare "test" o "[" "]" nella shell POSIX?

Opzione 1:

if [ "$var" = "dude" ] 
then 
    echo "Dude, your var equals dude." 
fi 

Opzione 2:

if test "$var" = "dude" 
then 
    echo "Dude, your var equals dude." 
fi 

Quale sintassi è preferito e perché? C'è una ragione per usare l'una sull'altra in certe situazioni?

+0

Sì, sono entrambi validi. No, non c'è una ragione particolare per preferire l'una rispetto all'altra - è una scelta stilistica. –

+0

'test' genererà probabilmente un fork di processo e quindi sarà meno efficiente. –

+3

@WillemVanOnsem, su una shell dove 'test' non è un builtin, quindi userà anche un esterno'/usr/bin/['- cercalo, il tuo sistema operativo * lo * spedisce come binario esterno (spesso, un hardlink allo stesso inode di/usr/bin/test', che osserva il suo 'argv [0]' per vedere come è stato chiamato e decide se scartare un trailing ']' dal suo argomento elenco). –

risposta

6

Non c'è alcuna differenza funzionale, rendendo questa una scelta puramente stilistica senza linee guida ampiamente accettate. The bash-hackers wiki ha una sezione estesa sul classico (conforme a POSIX) test, con una grande attenzione alle migliori pratiche e alle insidie, e non ha alcuna posizione su cui preferire.

Inoltre, the POSIX specification for test - mentre fa marchio una grande quantità di funzionalità obsolescent - specifica né forma preferita all'altra.

Detto questo, uno dei vantaggi di test è che è meno propizio per le persone attirare aspettative da altre lingue che si traducono in codice rotto o buggato. Ad esempio, è un errore comune scrivere , ma la gente non è vista per scrivere test$foo=1: È più visivamente ovvio che lo test "$foo" = 1 stia seguendo le stesse regole di analisi degli altri comandi della shell, e quindi richiede la stessa cura per quanto riguarda quoting e whitespace.


[1] Come -a, -o, ( e ), e qualsiasi utilizzo con più di quattro argomenti (escluso il trascinamento ] in un'istanza iniziato sotto il nome [).

+0

La shell POSIX non considera '-a' o' -o' obsoleti. [** POSIX Programmer's Manual (test) **] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html#tag_20_128) Credo che l'argomento contro il loro uso sia * la mancanza di chiarezza * dopo Bash introdotto '-a' (* true se il file esiste *). Ma il test POSIX non fa menzione di '&&' o '||'. –

+2

@ DavidC.Rankin, ... se si fa clic su '[OB XSI]' ovunque indicato in quella specifica - a cui si è collegati - apre il seguente, che spiega quei codici (e quindi che 'OB' significa obsoleto): http://pubs.opengroup.org/onlinepubs/9699919799/help/codes.html. Per citare da lì: "La funzionalità descritta potrebbe essere rimossa in una versione futura di questo volume di POSIX.1-2008 Le applicazioni POSIX rigorosamente conformi e le applicazioni XSI strettamente conformi non devono utilizzare funzionalità obsolete." –

+0

@ DavidC.Rankin, ...e ci sono buone ragioni per questo: nei casi con più di quattro argomenti con '-a' e' -o', ci sono ambiguità in cui l'idioma di '" x $ foo "' può essere necessario per disambiguare l'interpretazione tra i valori e testare la sintassi (in particolare quando quel set di valori può includere '(' o ')'). –