"$ {PS1-}" è sintassi valida e in cosa differisce dalla semplice "$ PS1"?


12

Sto guardando una sceneggiatura che ha:

if [ "${PS1-}" ]; then

Questo trailing -mi infastidisce un po 'perché non sembra la sintassi standard di Posix o Bash. È questa una sintassi arcana che esiste da sempre, o è un errore di battitura? Qualsiasi riferimento a standard / documenti sarebbe apprezzato.

Normalmente lo scriverei:

if [ "$PS1" ]; then

Qual è più corretto o c'è una differenza tra loro?

Risposte:


12

Questa è sicuramente la sintassi POSIX . parafrasando:

Usando ${parameter-word}, se lo parameterè

  • impostare e non null, quindi sostituire il valore di parameter,
  • impostare ma null, quindi sostituire null e
  • disinserito, quindi sostituire word.

Sessione di esempio:

$ echo "${parameter-word}"
word
$ parameter=
$ echo "${parameter-word}"

$ parameter=value
$ echo "${parameter-word}"
value

"Null" qui significa semplicemente la stringa vuota. Non esiste un valore null speciale nelle shell POSIX, ad esempio in contrasto con SQL.

Questo è anche documentato nella sezione "Espansione dei parametri" di man bash.


1
Immagino che le pagine man bash e dash siano incomplete, perché non menzionano questa sintassi (dispari)!
Gregor

1
@Gregor Entrambi i manuali lo menzionano. Nel manuale di Bash è nel paragrafo prima dell'elenco delle espansioni dei parametri, e nel manuale di Dash è nel paragrafo successivo.
Kusalananda

1
OK, "Omettendo i due punti ...." Non l'ho visto :(
Gregor

zshè l'unica shell che conosco che menziona esplicitamente le varianti prive di due punti, piuttosto che prendere semplicemente nota di ciò che fa omettere i due punti.
Chepner,

1
@pts, il testo in POSIX usa quasi esclusivamente il termine "null", che potrebbe spiegarne l'uso nelle pagine man.
Ilkkachu,

23

L'espansione della variabile ${parameter:-word}utilizzerà il valore di $parameterse è impostata e non nulla (non una stringa vuota), altrimenti utilizzerà la stringa word.

Se si omette :, non verrà verificato se il valore è vuoto, solo se non è impostato o meno.

Ciò significa che ${PS1-}si espanderà al valore di $PS1se è impostato, ma a una stringa vuota se è vuota o non impostata. In questo caso, questo è esattamente lo stesso come ${PS1:-}la stringa dopo -è anche vuoto.

La differenza tra "${PS1-}"e "$PS1"è sottile, come osserva @Rakesh Sharma: entrambi si espanderanno al valore di $PS1, o su una stringa vuota se non è impostato. L'eccezione è quando set -uè attivo, nel qual caso l'espansione delle variabili non impostate causerebbe un errore . Il valore predefinito (vuoto) impostato "${PS1-}"elude questo, espandendo un unset PS1nella stringa vuota senza errori.

Questa è la sintassi standard ( originata dalla shell Bourne alla fine degli anni '70 ), così come un paio di altre espansioni simili.


E poiché è stato citato, è lo stesso di "$PS1", poiché se PS1è vuoto, è vuoto e le virgolette impediscono che la parola scompaia completamente.
ilkkachu,

4
Finché set -unon è in vigore. Quando l'opzione nounset è attiva, allora "$ PS1" => dà errore. "$ {PS-}" no.

@RakeshSharma questo è un buon punto. La diversa sintassi può effettivamente produrre risultati diversi a seconda dell'opzione nounset, quindi il test ["$ {parametro-}"] è probabilmente più corretto!
Gregor

1
@Kusalananda: Nota che ${parameter:-word}utilizzerà il valore di $parameterse NON è NULL. In tutti gli altri casi (ovvero: impostato ma NULL o non impostato) verrà utilizzato word. La tua formulazione:if its set or null

@ikkachu: Sì, è corretto. Solo quando le variabili sono set AND nonnull=> usa se stesso. Altrimenti, ( set but NULL OR unset) => usa parole.

6

La sintassi:

${parameter:-word}

e un modulo speciale:

${parameter-word}

è la sintassi valida nella shell POSIX , significa utilizzare il valore predefinito wordse parameternon è impostato o è nullo.


Normalmente, con wordè vuoto, quindi:

${parameter-}

e:

$parameter

o:

${parameter}

sono equivalenti.

Ma sotto l'effetto di set -u, tutte le variabili non impostate causano la chiusura della shell. ${parameter-}è usato per bypassare quella rigida regola. Funziona in entrambi i casi, quindi sì, è il modo più corretto.

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.