In Bash, sono se [-z “$ 1”] e se [“$ 1” = “”] è lo stesso?


28

Nello scripting della shell Bash, qual è la differenza (se presente) tra le seguenti due affermazioni?

    1.) if [ -z "$1" ]
    2.) if [ "$1" = "" ]

Mi sono ritrovato a scrivere il secondo in alcuni script, ma poi ho letto qui che l'uso -zraggiunge la stessa cosa.

Se ci sono problemi nell'uso del secondo, dovremmo ignorare che il primo ha un aspetto migliore?


3
Per un confronto dettagliato, vedere la mia risposta su Stack Overflow. Inoltre, vedi questo e questo .
In pausa fino a nuovo avviso.

bei collegamenti, con alcune belle risposte :)
Johan

Risposte:


36

[ "$1" = "" ]e [ -z "$1" ]sono esattamente equivalenti in shell bash e altre POSIX compatibili. (Nota che ci deve essere uno spazio su ciascun lato delle parentesi, a meno che non ci sia un carattere non costituente una parola come ;.)

[è una shell integrata come qualsiasi altra; infatti può anche essere scritto test(l'unica differenza tra i due è che [richiede un ]come ultimo argomento). Quindi, se si esegue [ "$1" = "" ]con $1espansione per -zl'operatore di prova vede tre argomenti: -z, =e la stringa vuota. Alcune vecchie shell Bourne a volte generavano errori di analisi quando un operando sembrava un operatore in questo modo, anche se non vi era ambiguità nell'espressione completa. Non so se una versione abbia effettivamente avuto problemi con questa espressione particolare, ma espressioni più complesse potrebbero eliminarle. Potrebbero esserci state anche versioni che avevano problemi con parole vuote; questi non avrebbero supportato [ -z "$1" ]neanche. Un idioma comune della shell è[ x"$1" = x"" ]. Evita qualsiasi rischio di far analizzare gli operandi come operatori perché nessun operatore inizia con una lettera.

In ksh, bash e zsh, è possibile utilizzare la sintassi doppia staffa, [[ -z $1 ]]. Questa sintassi più recente (è della fine degli anni '80 anziché della metà degli anni '70) elimina il rischio di far analizzare gli operandi come operatori usando uno speciale costrutto sintattico piuttosto che un normale built-in. Gli operatori devono apparire letteralmente, senza virgolette tra parentesi doppie e non è necessario virgolette doppie per espansioni variabili.


Risolto l'errore di battitura con lo spazio mancante accanto alla parentesi.
Johan,
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.