A sintaxe válida “$ {PS1-}” e como ela é diferente da simples “$ PS1”?

12

Estou vendo um script que tenha:

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

Esse trailing - me incomoda um pouco porque não parece a sintaxe padrão do Posix ou do Bash. É essa sintaxe arcana que existe desde sempre, ou é um erro de digitação? Quaisquer referências a standards / docs serão apreciadas.

Normalmente eu codifico:

if [ "$PS1" ]; then

Qual é o mais correto ou existe diferença entre eles?

    
por Gregor 17.03.2017 / 14:46

3 respostas

12

Isso é definitivamente sintaxe POSIX . Parafraseando:

Usando ${parameter-word} , se parameter for

  • definido e não nulo, em seguida, substitua o valor de parameter ,
  • definido, mas nulo, substitua null e
  • desmarque e, em seguida, substitua word .

Exemplo de sessão:

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

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

"Nulo" aqui significa simplesmente a string vazia. Não há nenhum valor nulo especial em shells POSIX, em contraste com o SQL, por exemplo.

Isso também está documentado na seção "Expansão de Parâmetros" de man bash .

    
por 17.03.2017 / 14:54
21

A expansão variável ${parameter:-word} usará o valor de $parameter se estiver definido e não nulo (não é uma string vazia), caso contrário, usará a string word .

Omitir o : não testará se o valor estiver vazio, somente se não estiver definido ou não.

Isso significa que ${PS1-} expandirá para o valor de $PS1 se estiver definido, mas para uma sequência vazia se estiver vazia ou não definida. Neste caso, isso é exatamente o mesmo que ${PS1:-} como a string após - também estar vazia.

A diferença entre "${PS1-}" e "$PS1" é sutil, como observa @Rakesh Sharma: ambas se expandirão para o valor de $PS1 ou para uma sequência vazia se não for definida. A exceção é quando set -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 não definido PS1 para a cadeia vazia sem erro.

Esta é a sintaxe padrão ( originado no shell Bourne no final dos anos 70 , assim como outras expansões semelhantes.

    
por 17.03.2017 / 16:49
6

A sintaxe:

${parameter:-word}

e um formulário especial:

${parameter-word}

é a sintaxe válida no shell POSIX , significa usar o valor padrão word if parameter não está definido ou é nulo.

Normalmente, com word está vazio, então:

${parameter-}

e:

$parameter

ou:

${parameter}

são equivalentes.

Mas sob o efeito de set -u , todas as variáveis não configuradas fazem com que o shell seja finalizado. ${parameter-} é usado para ignorar essa regra estrita. Funciona em ambos os casos, então sim, é mais correto.

    
por 17.03.2017 / 15:18