Je regarde un script qui a:
if [ "${PS1-}" ]; then
Cela -
me dérange un peu parce qu'il ne semble pas avoir la syntaxe standard Posix ou Bash. Est-ce une syntaxe mystérieuse qui existe depuis toujours, ou est-ce une faute de frappe? Toute référence à des normes / documents serait appréciée.
Normalement, je le coderais:
if [ "$PS1" ]; then
Qu'est-ce qui est plus correct ou y a-t-il une différence entre eux?
zsh
est le seul shell que je connaisse qui mentionne explicitement les variantes sans colon, plutôt que de simplement noter ce que fait l'omission du colon.L'expansion variable
${parameter:-word}
utilisera la valeur de$parameter
si elle est définie et non nulle (pas une chaîne vide), sinon elle utilisera la chaîneword
.L'omission de
:
ne testera pas si la valeur est vide, seulement si elle n'est pas définie ou non.Cela signifie que
${PS1-}
sera étendu à la valeur de$PS1
si elle est définie, mais à une chaîne vide si elle est vide ou non définie. Dans ce cas, c'est exactement le même que${PS1:-}
que la chaîne après-
est vide aussi.La différence entre
"${PS1-}"
et"$PS1"
est subtile, comme le note @Rakesh Sharma: les deux se développeront à la valeur de$PS1
, ou à une chaîne vide si elle n'est pas définie. L'exception est quandset -u
est actif, auquel cas l'expansion des variables non définies entraînerait une erreur . La valeur par défaut (vide) définie par"${PS1-}"
contourne cela, étendant un non définiPS1
à la chaîne vide sans erreur.Il s'agit d'une syntaxe standard ( originaire du shell Bourne à la fin des années 70 ), tout comme quelques autres extensions similaires.
la source
"$PS1"
, car siPS1
est vide, il est vide et les guillemets empêchent le mot de disparaître complètement.set -u
n'est pas en vigueur. Lorsque l'option nounset est activée, "$ PS1" => donne une erreur. "$ {PS-}" ne le fera pas.${parameter:-word}
va utiliser la valeur de$parameter
si elle est NON NULL. Dans tous les autres cas (ce qui signifie: soit défini mais NULL ou non défini), il sera utiliséword
. Votre formulation:if its set or null
set AND nonnull
=> utiliser elles-mêmes. Sinon, (set but NULL OR unset
) => utiliser le mot.La syntaxe:
et un formulaire spécial:
est la syntaxe valide dans le shell POSIX , signifie utiliser la valeur par défaut
word
siparameter
est non défini ou nul.Normalement, avec
word
est vide, alors:et:
ou:
sont équivalents.
Mais sous l'effet de
set -u
, toutes les variables non définies entraînent la fermeture du shell.${parameter-}
est utilisé pour contourner cette règle stricte. Cela fonctionne dans les deux cas, donc oui, c'est plus correct.la source