Por favor, explique este código BASH (uma linha)

2

Nunca vi isso antes no BASH:

pidfile=${PIDFILE-/var/run/service.pid}

A parte que eu nunca vi / usei antes é a parte ${PIDFILE- .

    
por drewrockshard 20.12.2010 / 23:36

2 respostas

10

Isso significa usar $PIDFILE se $PIDFILE estiver definido ou /var/run/service.pid se $PIDFILE for indefinido.

Começando com um novo shell:

$ echo ${PIDFILE-/var/run/service.pid}
/var/run/service.pid

Agora defina PIDFILE:

$ PIDFILE=/var/run/myprogram.pid
$ echo ${PIDFILE-/var/run/service.pid}
/var/run/myprogram.pid

É dos velhos tempos da Bourne Shell sh man page .

   ${parameter-word}
          If parameter is set then substitute its value;
          otherwise substitute word.

A outra forma que você já deve ter visto é ${parameter:-word} . É semelhante, mas comporta-se de forma diferente se parameter estiver definido para a cadeia vazia.

   ${parameter:-word}
          Use Default Values.  If parameter is unset or null,
          the expansion of word is substituted.  Otherwise,
          the value of parameter is substituted.

Para demonstrar:

$ set | grep NOSUCHVAR    # produces no output because NOSUCHVAR is not defined
$ echo ${NOSUCHVAR-default}
default
$ echo ${NOSUCHVAR:-default}
default

$ NULLVAR=
$ set | grep NULLVAR      # produces output because NULLVAR is defined
NULLVAR=
$ echo ${NULLVAR-default}

$ echo ${NULLVAR:-default}
default

Observe como ${NULLVAR-default} se expande para a sequência vazia, porque NULLVAR está definido.

Para uma explicação completa, execute "man bash" e procure por Expansão de Parâmetros digitando "/ Expansão de Parâmetros".

O bit $ {parameter-word} está oculto nesta explicação:

    When  not  performing  substring  expansion, using the forms documented below,
    bash tests for a parameter that is unset or null.  Omitting the colon results
    in a test only for a parameter that is unset.

Obrigado a Dennis pela correção sobre set versus null.

    
por 20.12.2010 / 23:38
0

Mikel:

não deveria ser      pidfile=${PIDFILE:-/var/run/service.pid} do jeito que você está explicando?

    
por 20.12.2010 / 23:47