[“$ VAR” = “”] e [-z “$ VAR”] sono sempre equivalenti?


8

Il mio codice è simile al seguente:

VAR=""

while [ -z "$VAR" ]; do
  VAR=$( command | grep "important_string" )
done

Quindi voglio sondare l'output di command, fino a quando non important_stringappare e lo inserisco $VAR.

C'è qualche differenza funzionale tra [ -z "$VAR" ]e [ "$VAR" = "" ]?


3
==è una sintassi errata, ma funziona in molte conchiglie (presumibilmente perché è memoria muscolare per chiunque usi altre lingue). Dovresti usare =.
10

@ l0b0 lo ha copiato ==da qualche parte. Errore mio.
Minix,

Risposte:


5

Sì, loro ( [ -z "$VAR" ]e [ "$VAR" = "" ]...) sono equivalenti. Entrambi stanno verificando il vuoto di $VAR(ad esempio quando non è associato o impostato su una stringa vuota).

Come commentato da Celada , potrebbero accadere cose brutte quando si utilizza [ "$VAR" = "" ] if VARè un test valido (ad esempio if VARis -z), in particolare quando [(o test) non è un built-in della shell. Ma on bashor zshthe [è un builtin e questo non sembra essere un problema. È possibile utilizzare [ "x$VAR" = "x" ]per il test. Vedi test (1)

Certo, sto assumendo qualche shell POSIX o qualcosa di simile.

Forse -zpotrebbe essere leggermente più veloce (ma non dovresti preoccuparti dei microsecondi negli script di shell) e potresti trovare =forse più leggibile.


5
Ho pensato per certo che [ "$VAR" = "" ]era sbagliato perché se il contenuto di $VARdovesse iniziare con un trattino, ciò porterebbe a un errore di sintassi, ad esempio se $VARcontiene -zallora si espanderebbe a [ -z = "" ]- verificherebbe se =è vuoto (cosa che non lo è) e quindi trattare ""come un argomento estraneo? Ma non riesco a farlo fallire in questo modo ora che lo provo dopo aver letto la tua risposta! Uso decenni come [ "x$VAR" = "xfoo" ]per proteggermi da personaggi speciali $VAR, forse inutilmente!
Celada,

@Celada: penso che il tuo punto sia vero per le rare conchiglie in cui testnon è incorporato.
Basile Starynkevitch,

1
Penso che per quanto riguarda le espansioni, gli incorporamenti della shell dovrebbero comportarsi allo stesso modo dei comandi esterni. Non lo hai confuso con parole chiave come [[in bash? Sono davvero diversi. --- Non osservo alcun comportamento speciale riguardo l'espansione variabile con il testbuild-in di bash.
pabouk,

Ho provato conzsh
Basile Starynkevitch il

@Celada in realtà, hai ragione, ci sono così tante cose che potrebbero andare storte usando invece [ "$VAR" = "" ]è più sicuro da usare -z.
Braiam,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.