Estoy viendo un script que tiene:
if [ "${PS1-}" ]; then
Eso -
me molesta un poco porque no parece la sintaxis estándar de Posix o Bash. ¿Es esta una sintaxis arcana que ha existido desde siempre, o es un error tipográfico? Cualquier referencia a estándares / documentos sería apreciada.
Normalmente lo codificaría:
if [ "$PS1" ]; then
¿Cuál es más correcto o hay una diferencia entre ellos?
zsh
es el único shell que conozco que menciona explícitamente las variantes libres de colon, en lugar de simplemente hacer una nota de lo que hace omitir el colon.La expansión variable
${parameter:-word}
usará el valor de$parameter
si está establecido y no es nulo (no es una cadena vacía), de lo contrario usará la cadenaword
.Omitir
:
no probará si el valor está vacío, solo si está desarmado o no.Esto significa que
${PS1-}
se expandirá al valor de$PS1
si está configurado, pero a una cadena vacía si está vacío o sin configurar. En este caso, esto es exactamente lo mismo que${PS1:-}
como la cadena después-
también está vacía.La diferencia entre
"${PS1-}"
y"$PS1"
es sutil, como señala @Rakesh Sharma: ambos se expandirán al valor de$PS1
, o a una cadena vacía si no está establecida. La excepción es cuandoset -u
está activo, en cuyo caso expandir las variables no definidas causaría un error . El valor predeterminado (vacío) establecido por"${PS1-}"
evita esto, expandiendo un desarmadoPS1
a la cadena vacía sin error.Esta es la sintaxis estándar ( originada en el shell Bourne a finales de los 70 ), al igual que otras expansiones similares.
fuente
"$PS1"
, siPS1
está vacío, está vacío, y las comillas evitan que la palabra desaparezca por completo.set -u
no esté en vigor. Cuando la opción nounset está activada, entonces "$ PS1" => da error. "$ {PS-}" no lo hará.${parameter:-word}
usará el valor de$parameter
si es NO NULL. En todos los demás casos (es decir: establecido pero NULL o no establecido) se utilizaráword
. Su redacción:if its set or null
set AND nonnull
=> se usan a sí mismas. De lo contrario, (set but NULL OR unset
) => usan palabras.La sintaxis:
y una forma especial:
es la sintaxis válida en el shell POSIX , significa usar el valor predeterminado
word
si noparameter
está configurado o es nulo.Normalmente, con
word
está vacío, entonces:y:
o:
son equivalentes
Pero bajo el efecto de
set -u
, todas las variables no configuradas hacen que se termine el shell.${parameter-}
se usa para saltarse esa estricta regla. Funciona en ambos casos, así que sí, es la forma más correcta.fuente