Eu estou olhando para um script que possui:
if [ "${PS1-}" ]; then
Essa trilha -
me incomoda um pouco, porque não parece com a sintaxe padrão Posix ou Bash. É alguma sintaxe misteriosa que existe desde sempre, ou é um erro de digitação? Qualquer referência a padrões / documentos seria apreciada.
Normalmente eu codificaria:
if [ "$PS1" ]; then
O que é mais correto ou há uma diferença entre eles?
zsh
é o único shell que conheço que menciona explicitamente as variantes sem cólon, em vez de apenas tomar nota do que omitir o cólon faz.A expansão da variável
${parameter:-word}
usará o valor de$parameter
se estiver definido e não for nulo (não uma sequência vazia), caso contrário, a sequência será usadaword
.A omissão do
:
teste não testará se o valor está vazio, apenas se está desconfigurado ou não.Isso significa que
${PS1-}
será expandido para o valor de$PS1
se estiver definido, mas para uma sequência vazia se estiver vazia ou não definida. Neste caso, este é exatamente o mesmo como${PS1:-}
como a cadeia depois-
também está vazio.A diferença entre
"${PS1-}"
e"$PS1"
é sutil, como observa @Rakesh Sharma: ambos serão expandidos para o valor de$PS1
ou para uma string vazia, se não estiver definida. A exceção é quandoset -u
está ativo; nesse caso, a expansão de variáveis não definidas causaria um erro . O valor padrão (vazio) definido por"${PS1-}"
contorna isso, expandindo um conjuntoPS1
para a sequência vazia sem erro.Essa é a sintaxe padrão ( originada no shell Bourne no final dos anos 70 ), assim como outras expansões semelhantes.
fonte
"$PS1"
, se ifPS1
está vazio, está vazio, e as aspas evitam que a palavra desapareça completamente.set -u
não esteja em vigor. Quando a opção de conjunto de substantivos está ativada, "$ PS1" => gera erro. "$ {PS-}" não.${parameter:-word}
o valor será usado$parameter
se NÃO for NULL. Em todos os outros casos (ou seja: definido, mas NULL ou não definido), ele será usadoword
. Sua formulação:if its set or null
set AND nonnull
=> use-se. Caso contrário, (set but NULL OR unset
) => use word.A sintaxe:
e um formulário especial:
é a sintaxe válida no shell do POSIX , significa usar o valor padrão
word
separameter
for definido ou nulo.Normalmente, com
word
está vazio, então:e:
ou:
são equivalentes.
Porém, sob o efeito de
set -u
, todas as variáveis não definidas fazem com que o shell seja encerrado.${parameter-}
é usado para ignorar essa regra estrita. Funciona nos dois casos, então sim, é a maneira mais correta.fonte