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?

zshes 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$parametersi 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$PS1si 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 -uestá 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 desarmadoPS1a 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", siPS1está vacío, está vacío, y las comillas evitan que la palabra desaparezca por completo.set -uno esté en vigor. Cuando la opción nounset está activada, entonces "$ PS1" => da error. "$ {PS-}" no lo hará.${parameter:-word}usará el valor de$parametersi 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 nullset 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
wordsi noparameterestá configurado o es nulo.Normalmente, con
wordestá 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