Comparação e expansão de suporte

1

A seguir, um script de shell simples para demonstrar como as variáveis de ambiente estão acessíveis.

if [[ ${x+X} = X ]] ## If $x is set
then
  if [[ -n $x ]] ## if $x is not empty
  then
    printf " \$x = %s\n" "$x"
  else
    printf " \$x is set but empty\n"
  fi
else
  printf " %s is not set\n" "\$x"
fi

No entanto, eu tive as seguintes dúvidas em relação à primeira "condição se".

  1. Dentro do [[operador, um único "=" é usado para comparação. Mas não é = um operador de atribuição?
  2. Você poderia por favor explicar "$ {x + X}" funciona neste script?
por abhishek nair 22.12.2015 / 20:41

2 respostas

3
{   unset x
    echo ${x+"you won't see this"}
    x=
    echo ${x+"this you'll see"} ${x:+"and this you won't"}
    x=1
    echo ${x+"now you'll"} ${x:+"see it all"}
}
this you'll see
now you'll see it all

Praticamente todas as expansões de parâmetro POSIX básicas se comportam de maneira diferente quando o parâmetro expandido é indefinido ou nulo dependendo do modificador de dois pontos opcional : .

A forma + de expansão de parâmetro expande para word quando o parâmetro é definido, independentemente do seu conteúdo na expansão:

${parameter+word}

No entanto, ele não é expandido para word quando $parameter é definido , mas é nulo no seguinte:

${parameter:+word}

Existem também os formulários de expansão para - , = e ? . O - expandirá para word quando $parameter for não definido , ou, com : , quando não estiver definido ou será nulo. O = expandirá identicamente como - , exceto que também definirá o valor nulo ou não definido do $parameter como word . E ? mata um shell ao gravar uma mensagem de erro opcional word para stderr quando $parameter não está definido ou, com : , do valor nulo. Para qualquer um desses três, se o $parameter for definido e, com : , não for nulo, o $parameter será expandido para seu valor da mesma forma que seria de outra forma.

    
por 22.12.2015 / 22:41
0

Não é = um operador de atribuição?

Sim, é, e também é um operador de comparação, dependendo de onde aparece: como em muitas línguas, o significado de tokens depende contexto. Bash suporta a atribuição, na forma name=[value] , e comparação usando as linguagens de expressões para test (também conhecido como [ ) e [[ ; dentro desses, = tem um significado diferente.

O que é ${x+X} ?

O Bash suporta a sintaxe ${parameter:+word} :

Use Alternate Value. If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted.

No seu caso, isso significa que, se x não estiver definido, a expressão expandirá para a string vazia (a comparação com X falhará), e, se estiver definido, ele será expandido para X (a comparação produzirá verdade).

A sintaxe ${parameter+word} é uma variação de ${parameter:+word} , com uma pequena diferença, quando parameter está definido, mas vazio:

x            ${x+alt}   ${x:+alt}
------------ ---------- ----------
unset                ''         ''
set to ''           alt         ''
non-empty           alt        alt
    
por 22.12.2015 / 22:32

Tags